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 @@ @@ -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 \ No newline at end of file 39 \ No newline at end of file
file_link/models.py
@@ -43,3 +43,6 @@ class FileLink(Resource): @@ -43,3 +43,6 @@ class FileLink(Resource):
43 43
44 def delete_link(self): 44 def delete_link(self):
45 return 'file_links:delete' 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,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 \ No newline at end of file 0 \ No newline at end of file
file_link/views.py
@@ -312,9 +312,9 @@ class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView): @@ -312,9 +312,9 @@ class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView):
312 login_url = reverse_lazy("users:login") 312 login_url = reverse_lazy("users:login")
313 redirect_field_name = 'next' 313 redirect_field_name = 'next'
314 314
315 - template_name = 'file_links/delete.html' 315 + template_name = 'resources/delete.html'
316 model = FileLink 316 model = FileLink
317 - context_object_name = 'file_link' 317 + context_object_name = 'resource'
318 318
319 def dispatch(self, request, *args, **kwargs): 319 def dispatch(self, request, *args, **kwargs):
320 slug = self.kwargs.get('slug', '') 320 slug = self.kwargs.get('slug', '')
webpage/models.py
@@ -24,3 +24,6 @@ class Webpage(Resource): @@ -24,3 +24,6 @@ class Webpage(Resource):
24 24
25 def delete_link(self): 25 def delete_link(self):
26 return 'webpages:delete' 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,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 \ No newline at end of file 0 \ No newline at end of file
webpage/views.py
@@ -371,9 +371,9 @@ class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView): @@ -371,9 +371,9 @@ class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView):
371 login_url = reverse_lazy("users:login") 371 login_url = reverse_lazy("users:login")
372 redirect_field_name = 'next' 372 redirect_field_name = 'next'
373 373
374 - template_name = 'webpages/delete.html' 374 + template_name = 'resources/delete.html'
375 model = Webpage 375 model = Webpage
376 - context_object_name = 'webpage' 376 + context_object_name = 'resource'
377 377
378 def dispatch(self, request, *args, **kwargs): 378 def dispatch(self, request, *args, **kwargs):
379 slug = self.kwargs.get('slug', '') 379 slug = self.kwargs.get('slug', '')
youtube_video/forms.py
@@ -60,6 +60,16 @@ class YTVideoForm(forms.ModelForm): @@ -60,6 +60,16 @@ class YTVideoForm(forms.ModelForm):
60 60
61 return name 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 def save(self, commit = True): 73 def save(self, commit = True):
64 super(YTVideoForm, self).save(commit = True) 74 super(YTVideoForm, self).save(commit = True)
65 75
@@ -89,4 +99,4 @@ class YTVideoForm(forms.ModelForm): @@ -89,4 +99,4 @@ class YTVideoForm(forms.ModelForm):
89 99
90 return self.instance 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 \ No newline at end of file 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 \ No newline at end of file 104 \ No newline at end of file
youtube_video/models.py
@@ -15,12 +15,15 @@ class YTVideo(Resource): @@ -15,12 +15,15 @@ class YTVideo(Resource):
15 15
16 def access_link(self): 16 def access_link(self):
17 if self.show_window: 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 def update_link(self): 22 def update_link(self):
23 return 'youtube:update' 23 return 'youtube:update'
24 24
25 def delete_link(self): 25 def delete_link(self):
26 return 'webpages:delete' 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,7 +239,7 @@
239 {% endif %} 239 {% endif %}
240 </div> 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 {% render_field form.students class='form-control' %} 243 {% render_field form.students class='form-control' %}
244 244
245 <span id="helpBlock" class="help-block">{{ form.students.help_text }}</span> 245 <span id="helpBlock" class="help-block">{{ form.students.help_text }}</span>
@@ -259,7 +259,7 @@ @@ -259,7 +259,7 @@
259 259
260 <br clear="all" /> 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 {% render_field form.groups class='form-control' %} 263 {% render_field form.groups class='form-control' %}
264 264
265 <span id="helpBlock" class="help-block">{{ form.groups.help_text }}</span> 265 <span id="helpBlock" class="help-block">{{ form.groups.help_text }}</span>
@@ -354,23 +354,33 @@ @@ -354,23 +354,33 @@
354 var checkbox = $(this).parent().parent().find('.end_date'); 354 var checkbox = $(this).parent().parent().find('.end_date');
355 $(checkbox).prop('checked', true); 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 $(row).find('.pend_subj').val(subject); 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 {% if not pendencies_form.is_valid and pendencies_form.is_bound %} 385 {% if not pendencies_form.is_valid and pendencies_form.is_bound %}
376 $("#notifications").collapse('toggle'); 386 $("#notifications").collapse('toggle');
youtube_video/templates/youtube/view.html 0 → 100644
@@ -0,0 +1,65 @@ @@ -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 @@ @@ -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 \ No newline at end of file 38 \ No newline at end of file
youtube_video/urls.py
@@ -6,4 +6,6 @@ from . import views @@ -6,4 +6,6 @@ from . import views
6 urlpatterns = [ 6 urlpatterns = [
7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
8 url(r'^update/(?P<topic_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), 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,6 +12,57 @@ from topics.models import Topic
12 from .forms import YTVideoForm, InlinePendenciesFormset 12 from .forms import YTVideoForm, InlinePendenciesFormset
13 from .models import YTVideo 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 class CreateView(LoginRequiredMixin, generic.edit.CreateView): 66 class CreateView(LoginRequiredMixin, generic.edit.CreateView):
16 login_url = reverse_lazy("users:login") 67 login_url = reverse_lazy("users:login")
17 redirect_field_name = 'next' 68 redirect_field_name = 'next'
@@ -68,6 +119,9 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): @@ -68,6 +119,9 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
68 return initial 119 return initial
69 120
70 def form_invalid(self, form, pendencies_form): 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 return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form)) 125 return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
72 126
73 def form_valid(self, form, pendencies_form): 127 def form_valid(self, form, pendencies_form):
@@ -111,14 +165,14 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): @@ -111,14 +165,14 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
111 def get_success_url(self): 165 def get_success_url(self):
112 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)) 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 return success_url 177 return success_url
124 178
@@ -170,6 +224,9 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): @@ -170,6 +224,9 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
170 return self.form_invalid(form, pendencies_form) 224 return self.form_invalid(form, pendencies_form)
171 225
172 def form_invalid(self, form, pendencies_form): 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 return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form)) 230 return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
174 231
175 def form_valid(self, form, pendencies_form): 232 def form_valid(self, form, pendencies_form):
@@ -207,13 +264,13 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): @@ -207,13 +264,13 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
207 def get_success_url(self): 264 def get_success_url(self):
208 messages.success(self.request, _('The YouTube Video "%s" was updated successfully!')%(self.object.name)) 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 return success_url 276 return success_url
220 \ No newline at end of file 277 \ No newline at end of file