Commit 5f3359f051a64596c701490da2acae805e2857a8

Authored by Zambom
1 parent 574bd37c

Adding youtube video app

amadeus/settings.py
... ... @@ -65,11 +65,12 @@ INSTALLED_APPS = [
65 65 'topics',
66 66 'pendencies',
67 67 'file_link',
  68 + 'links',
68 69 'webpage',
  70 + 'youtube_video',
69 71 'mailsender',
70 72 'security',
71 73 'themes',
72   - 'links'
73 74 ]
74 75  
75 76 MIDDLEWARE_CLASSES = [
... ...
amadeus/urls.py
... ... @@ -30,6 +30,7 @@ urlpatterns = [
30 30 url(r'^groups/', include('students_group.urls', namespace = 'groups')),
31 31 url(r'^topics/', include('topics.urls', namespace = 'topics')),
32 32 url(r'^webpages/', include('webpage.urls', namespace = 'webpages')),
  33 + url(r'^ytvideo/', include('youtube_video.urls', namespace = 'youtube')),
33 34 url(r'^file_links/', include('file_link.urls', namespace = 'file_links')),
34 35 url(r'^mailsender/', include('mailsender.urls', namespace = 'mailsender')),
35 36 url(r'^security/', include('security.urls', namespace = 'security')),
... ...
categories/migrations/0011_auto_20170201_1732.py 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2017-02-01 20:32
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.conf import settings
  6 +from django.db import migrations, models
  7 +
  8 +
  9 +class Migration(migrations.Migration):
  10 +
  11 + dependencies = [
  12 + ('categories', '0010_auto_20170201_0013'),
  13 + ]
  14 +
  15 + operations = [
  16 + migrations.AlterField(
  17 + model_name='category',
  18 + name='coordinators',
  19 + field=models.ManyToManyField(blank=True, related_name='Coordenadores', to=settings.AUTH_USER_MODEL),
  20 + ),
  21 + ]
... ...
topics/templates/topics/list.html
... ... @@ -52,7 +52,7 @@
52 52 <i class="fa fa-angle-right"></i> {% trans 'Add Resource' %}
53 53 </button>
54 54 <ul class="dropdown-menu">
55   - <li><a href="#"><i class="fa fa-video-camera"></i> {% trans 'Video Embed' %}</a></li>
  55 + <li><a href="{% url 'youtube:create' topic.slug %}"><i class="fa fa-video-camera"></i> {% trans 'Video Embed' %}</a></li>
56 56 <li><a href="#"><i class="fa fa-comments-o"></i> {% trans 'Forum' %}</a></li>
57 57 <li><a href="{% url 'file_links:create' topic.slug %}"><i class="fa fa-file-archive-o"></i> {% trans 'File Link' %}</a></li>
58 58 <li><a href="{% url 'links:create' topic.slug %}" > <i class="fa fa-globe"></i> {% trans "Link to Website" %}</a>
... ...
youtube_video/__init__.py 0 → 100644
youtube_video/admin.py 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +from django.contrib import admin
  2 +
  3 +# Register your models here.
... ...
youtube_video/apps.py 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +from django.apps import AppConfig
  2 +
  3 +
  4 +class YoutubeVideoConfig(AppConfig):
  5 + name = 'youtube_video'
... ...
youtube_video/forms.py 0 → 100644
... ... @@ -0,0 +1,89 @@
  1 +# coding=utf-8
  2 +from django import forms
  3 +from django.utils.translation import ugettext_lazy as _
  4 +from django.forms.models import inlineformset_factory
  5 +
  6 +from subjects.models import Tag
  7 +
  8 +from pendencies.forms import PendenciesForm
  9 +from pendencies.models import Pendencies
  10 +
  11 +from .models import YTVideo
  12 +
  13 +class YTVideoForm(forms.ModelForm):
  14 + subject = None
  15 +
  16 + def __init__(self, *args, **kwargs):
  17 + super(YTVideoForm, self).__init__(*args, **kwargs)
  18 +
  19 + self.subject = kwargs['initial'].get('subject', None)
  20 +
  21 + if self.instance.id:
  22 + self.subject = self.instance.topic.subject
  23 + self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True))
  24 +
  25 + self.fields['students'].queryset = self.subject.students.all()
  26 + self.fields['groups'].queryset = self.subject.group_subject.all()
  27 +
  28 + tags = forms.CharField(label = _('Tags'), required = False)
  29 +
  30 + class Meta:
  31 + model = YTVideo
  32 + fields = ['name', 'url', 'brief_description', 'all_students', 'students', 'groups', 'show_window', 'visible']
  33 + labels = {
  34 + 'name': _('Video title'),
  35 + }
  36 + widgets = {
  37 + 'brief_description': forms.Textarea,
  38 + 'students': forms.SelectMultiple,
  39 + 'groups': forms.SelectMultiple,
  40 + }
  41 +
  42 + def clean_name(self):
  43 + name = self.cleaned_data.get('name', '')
  44 +
  45 + topics = self.subject.topic_subject.all()
  46 +
  47 + for topic in topics:
  48 + if self.instance.id:
  49 + same_name = topic.resource_topic.filter(name__unaccent__iexact = name).exclude(id = self.instance.id).count()
  50 + else:
  51 + same_name = topic.resource_topic.filter(name__unaccent__iexact = name).count()
  52 +
  53 + if same_name > 0:
  54 + self._errors['name'] = [_('This subject already has a youtube video with this name')]
  55 +
  56 + return ValueError
  57 +
  58 + return name
  59 +
  60 + def save(self, commit = True):
  61 + super(YTVideoForm, self).save(commit = True)
  62 +
  63 + self.instance.save()
  64 +
  65 + previous_tags = self.instance.tags.all()
  66 +
  67 + tags = self.cleaned_data['tags'].split(",")
  68 +
  69 + #Excluding unwanted tags
  70 + for prev in previous_tags:
  71 + if not prev.name in tags:
  72 + self.instance.tags.remove(prev)
  73 +
  74 + for tag in tags:
  75 + tag = tag.strip()
  76 +
  77 + exist = Tag.objects.filter(name = tag).exists()
  78 +
  79 + if exist:
  80 + new_tag = Tag.objects.get(name = tag)
  81 + else:
  82 + new_tag = Tag.objects.create(name = tag)
  83 +
  84 + if not new_tag in self.instance.tags.all():
  85 + self.instance.tags.add(new_tag)
  86 +
  87 + return self.instance
  88 +
  89 +InlinePendenciesFormset = inlineformset_factory(YTVideo, Pendencies, form = PendenciesForm, extra = 1, max_num = 2, validate_max = True, can_delete = True)
0 90 \ No newline at end of file
... ...
youtube_video/migrations/0001_initial.py 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2017-02-01 20:32
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations, models
  6 +import django.db.models.deletion
  7 +
  8 +
  9 +class Migration(migrations.Migration):
  10 +
  11 + initial = True
  12 +
  13 + dependencies = [
  14 + ('topics', '0007_auto_20170123_1911'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.CreateModel(
  19 + name='YTVideo',
  20 + fields=[
  21 + ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='topics.Resource')),
  22 + ('url', models.URLField(max_length=250, verbose_name='URL')),
  23 + ],
  24 + options={
  25 + 'verbose_name': 'YTVideo',
  26 + 'verbose_name_plural': 'YTVideos',
  27 + },
  28 + bases=('topics.resource',),
  29 + ),
  30 + ]
... ...
youtube_video/migrations/__init__.py 0 → 100644
youtube_video/models.py 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +from django.db import models
  2 +from django.utils.translation import ugettext_lazy as _
  3 +
  4 +from topics.models import Resource
  5 +
  6 +class YTVideo(Resource):
  7 + url = models.URLField(_('URL'), max_length = 250)
  8 +
  9 + class Meta:
  10 + verbose_name = _('YTVideo')
  11 + verbose_name_plural = _('YTVideos')
  12 +
  13 + def __str__(self):
  14 + return self.name
  15 +
  16 + def access_link(self):
  17 + if self.show_window:
  18 + return 'webpages:window_view'
  19 +
  20 + return 'webpages:view'
  21 +
  22 + def update_link(self):
  23 + return 'webpages:update'
  24 +
  25 + def delete_link(self):
  26 + return 'webpages:delete'
... ...
youtube_video/templates/youtube/_form.html 0 → 100644
... ... @@ -0,0 +1,347 @@
  1 +{% load static i18n %}
  2 +{% load widget_tweaks %}
  3 +
  4 +<form method="post" action="" enctype="multipart/form-data">
  5 + {% csrf_token %}
  6 +
  7 + {% render_field form.control_subject %}
  8 +
  9 + <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
  10 + <label for="{{ form.name.auto_id }}">{{ form.name.label }} <span>*</span></label>
  11 + {% render_field form.name class='form-control' %}
  12 +
  13 + <span id="helpBlock" class="help-block">{{ form.name.help_text }}</span>
  14 +
  15 + {% if form.name.errors %}
  16 + <div class="alert alert-danger alert-dismissible" role="alert">
  17 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  18 + <span aria-hidden="true">&times;</span>
  19 + </button>
  20 + <ul>
  21 + {% for error in form.name.errors %}
  22 + <li>{{ error }}</li>
  23 + {% endfor %}
  24 + </ul>
  25 + </div>
  26 + {% endif %}
  27 + </div>
  28 +
  29 + <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
  30 + <label for="{{ form.url.auto_id }}">{{ form.url.label }} <span>*</span></label>
  31 + {% render_field form.url class='form-control' %}
  32 +
  33 + <span id="helpBlock" class="help-block">{{ form.url.help_text }}</span>
  34 +
  35 + {% if form.url.errors %}
  36 + <div class="alert alert-danger alert-dismissible" role="alert">
  37 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  38 + <span aria-hidden="true">&times;</span>
  39 + </button>
  40 + <ul>
  41 + {% for error in form.url.errors %}
  42 + <li>{{ error }}</li>
  43 + {% endfor %}
  44 + </ul>
  45 + </div>
  46 + {% endif %}
  47 + </div>
  48 +
  49 + <legend>{% trans 'Common resources settings' %}</legend>
  50 +
  51 + <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
  52 + <label for="{{ form.brief_description.auto_id }}">{{ form.brief_description.label }}</label>
  53 + {% render_field form.brief_description class='form-control text_wysiwyg' %}
  54 +
  55 + <span id="helpBlock" class="help-block">{{ form.brief_description.help_text }}</span>
  56 +
  57 + {% if form.brief_description.errors %}
  58 + <div class="alert alert-danger alert-dismissible" role="alert">
  59 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  60 + <span aria-hidden="true">&times;</span>
  61 + </button>
  62 + <ul>
  63 + {% for error in form.brief_description.errors %}
  64 + <li>{{ error }}</li>
  65 + {% endfor %}
  66 + </ul>
  67 + </div>
  68 + {% endif %}
  69 + </div>
  70 +
  71 + <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
  72 + <label for="{{ form.tags.auto_id }}">{{ form.tags.label }}</label>
  73 + {% render_field form.tags class='form-control' data-role="tagsinput" %}
  74 +
  75 + <span id="helpBlock" class="help-block">{{ form.tags.help_text }}</span>
  76 +
  77 + {% if form.tags.errors %}
  78 + <div class="alert alert-danger alert-dismissible" role="alert">
  79 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  80 + <span aria-hidden="true">&times;</span>
  81 + </button>
  82 + <ul>
  83 + {% for error in form.tags.errors %}
  84 + <li>{{ error }}</li>
  85 + {% endfor %}
  86 + </ul>
  87 + </div>
  88 + {% endif %}
  89 + </div>
  90 +
  91 + <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true">
  92 + <div class="panel panel-info">
  93 + <div class="panel-heading">
  94 + <div class="row">
  95 + <div class="col-md-12">
  96 + <a data-parent="#professors_accordion" data-toggle="collapse" href="#notifications">
  97 + <h4 class="panel-title">
  98 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label>{% trans 'Pendencies Notifications' %}</label>
  99 + </h4>
  100 + </a>
  101 + </div>
  102 + </div>
  103 + </div>
  104 + <div id="notifications" class="panel-collapse collapse">
  105 +
  106 + <div class="notifies">
  107 + <div style="text-align:left">
  108 + {% render_field pendencies_form.id %}
  109 + {% render_field pendencies_form.resource %}
  110 + {% render_field pendencies_form.subject class='pend_subj' %}
  111 +
  112 + <div class="form-group{% if pendencies_form.has_error %} has-error {% endif %} row">
  113 + <label for="{{ pendencies_form.action.auto_id }}" class="pull-left action_label contol-label">
  114 + {% trans 'Action not performed by the user' %}:
  115 + </label>
  116 + <div class="col-md-3">
  117 + {% render_field pendencies_form.action class='form-control' %}
  118 + </div>
  119 +
  120 + <br clear="all" />
  121 +
  122 + <span id="helpBlock" class="help-block">{{ pendencies_form.action.help_text }}</span>
  123 +
  124 + {% if pendencies_form.action.errors %}
  125 + <div class="alert alert-danger alert-dismissible" role="alert">
  126 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  127 + <span aria-hidden="true">&times;</span>
  128 + </button>
  129 + <ul>
  130 + {% for error in pendencies_form.action.errors %}
  131 + <li>{{ error }}</li>
  132 + {% endfor %}
  133 + </ul>
  134 + </div>
  135 + {% endif %}
  136 + </div>
  137 + <br clear="all" />
  138 + <div class="row">
  139 + <div class="col-md-12">
  140 + <p>{% trans 'Wished period' %}: </p>
  141 + </div>
  142 + </div>
  143 + <div class="form-group{% if pendencies_form.has_error %} has-error {% endif %} row">
  144 + <div class="col-lg-2 col-md-2 col-sm-2 col-xs-3 checkbox">
  145 + <label>
  146 + {% render_field pendencies_form.begin_date_check class="begin_date" %} {{ pendencies_form.begin_date.label }}
  147 + </label>
  148 + </div>
  149 + <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
  150 + {% render_field pendencies_form.begin_date class='form-control datetime-picker begin_date_input' %}
  151 + </div>
  152 + </div>
  153 + <div class="row">
  154 + <span id="helpBlock" class="help-block">{{ pendencies_form.begin_date.help_text }}</span>
  155 +
  156 + {% if pendencies_form.begin_date.errors %}
  157 + <div class="alert alert-danger alert-dismissible" role="alert">
  158 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  159 + <span aria-hidden="true">&times;</span>
  160 + </button>
  161 + <ul>
  162 + {% for error in pendencies_form.begin_date.errors %}
  163 + <li>{{ error }}</li>
  164 + {% endfor %}
  165 + </ul>
  166 + </div>
  167 + {% endif %}
  168 + </div>
  169 + <div class="form-group{% if pendencies_form.has_error %} has-error {% endif %} row">
  170 + <div class="col-lg-2 col-md-2 col-sm-2 col-xs-3 checkbox">
  171 + <label>
  172 + {% render_field pendencies_form.end_date_check class="end_date" %} {{ pendencies_form.end_date.label }}
  173 + </label>
  174 + </div>
  175 + <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
  176 + {% render_field pendencies_form.end_date class='form-control datetime-picker end_date_input' %}
  177 + </div>
  178 + </div>
  179 + <div class="row">
  180 + <span id="helpBlock" class="help-block">{{ pendencies_form.end_date.help_text }}</span>
  181 +
  182 + {% if pendencies_form.end_date.errors %}
  183 + <div class="alert alert-danger alert-dismissible" role="alert">
  184 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  185 + <span aria-hidden="true">&times;</span>
  186 + </button>
  187 + <ul>
  188 + {% for error in pendencies_form.end_date.errors %}
  189 + <li>{{ error }}</li>
  190 + {% endfor %}
  191 + </ul>
  192 + </div>
  193 + {% endif %}
  194 + </div>
  195 + </div>
  196 + </div>
  197 + </div>
  198 + </div>
  199 +
  200 + <div class="panel panel-info">
  201 + <div class="panel-heading">
  202 + <div class="row">
  203 + <div class="col-md-12">
  204 + <a data-parent="#professors_accordion" data-toggle="collapse" href="#students">
  205 + <h4 class="panel-title">
  206 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ form.students.auto_id }}">{{ form.students.label }}</label>
  207 + </h4>
  208 + </a>
  209 + </div>
  210 + </div>
  211 + </div>
  212 + <div id="students" class="panel-collapse collapse">
  213 + <div class="form-group{% if form.has_error %} has-error {% endif %}">
  214 + <div class=" checkbox">
  215 + <label for="{{ form.all_students.auto_id }}">
  216 + {% render_field form.all_students %} {{ form.all_students.label }}
  217 + </label>
  218 + </div>
  219 +
  220 + <span id="helpBlock" class="help-block">{{ form.all_students.help_text }}</span>
  221 +
  222 + {% if form.all_students.errors %}
  223 + <div class="alert alert-danger alert-dismissible" role="alert">
  224 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  225 + <span aria-hidden="true">&times;</span>
  226 + </button>
  227 + <ul>
  228 + {% for error in form.all_students.errors %}
  229 + <li>{{ error }}</li>
  230 + {% endfor %}
  231 + </ul>
  232 + </div>
  233 + {% endif %}
  234 + </div>
  235 +
  236 + <p><em>{% trans 'Attribute students to webpage' %}:</em></p>
  237 + {% render_field form.students class='form-control' %}
  238 +
  239 + <span id="helpBlock" class="help-block">{{ form.students.help_text }}</span>
  240 +
  241 + {% if form.students.errors %}
  242 + <div class="alert alert-danger alert-dismissible" role="alert">
  243 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  244 + <span aria-hidden="true">&times;</span>
  245 + </button>
  246 + <ul>
  247 + {% for error in form.students.errors %}
  248 + <li>{{ error }}</li>
  249 + {% endfor %}
  250 + </ul>
  251 + </div>
  252 + {% endif %}
  253 +
  254 + <br clear="all" />
  255 +
  256 + <p><em>{% trans 'Attribute groups to webpage' %}:</em></p>
  257 + {% render_field form.groups class='form-control' %}
  258 +
  259 + <span id="helpBlock" class="help-block">{{ form.groups.help_text }}</span>
  260 +
  261 + {% if form.groups.errors %}
  262 + <div class="alert alert-danger alert-dismissible" role="alert">
  263 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  264 + <span aria-hidden="true">&times;</span>
  265 + </button>
  266 + <ul>
  267 + {% for error in form.groups.errors %}
  268 + <li>{{ error }}</li>
  269 + {% endfor %}
  270 + </ul>
  271 + </div>
  272 + {% endif %}
  273 + </div>
  274 + </div>
  275 + </div>
  276 +
  277 + <div class="form-group{% if form.has_error %} has-error {% endif %}">
  278 + <div class=" checkbox">
  279 + <label for="{{ form.show_window.auto_id }}">
  280 + {% render_field form.show_window %} {{ form.show_window.label }}
  281 + </label>
  282 + </div>
  283 +
  284 + <span id="helpBlock" class="help-block">{{ form.show_window.help_text }}</span>
  285 +
  286 + {% if form.show_window.errors %}
  287 + <div class="alert alert-danger alert-dismissible" role="alert">
  288 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  289 + <span aria-hidden="true">&times;</span>
  290 + </button>
  291 + <ul>
  292 + {% for error in form.show_window.errors %}
  293 + <li>{{ error }}</li>
  294 + {% endfor %}
  295 + </ul>
  296 + </div>
  297 + {% endif %}
  298 + </div>
  299 +
  300 + <div class="form-group{% if form.has_error %} has-error {% endif %}">
  301 + <div class=" checkbox">
  302 + <label for="{{ form.visible.auto_id }}">
  303 + {% render_field form.visible %} {{ form.visible.label }}
  304 + </label>
  305 + </div>
  306 +
  307 + <span id="helpBlock" class="help-block">{{ form.visible.help_text }}</span>
  308 +
  309 + {% if form.visible.errors %}
  310 + <div class="alert alert-danger alert-dismissible" role="alert">
  311 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  312 + <span aria-hidden="true">&times;</span>
  313 + </button>
  314 + <ul>
  315 + {% for error in form.visible.errors %}
  316 + <li>{{ error }}</li>
  317 + {% endfor %}
  318 + </ul>
  319 + </div>
  320 + {% endif %}
  321 + </div>
  322 +
  323 + <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">
  324 + <div class="text-center">
  325 + <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" />
  326 + </div>
  327 + </div>
  328 +</form>
  329 +<script type="text/javascript">
  330 + $(function() {
  331 + var begin_val = $('.begin_date_input').val(),
  332 + end_val = $('.end_date_input').val();
  333 +
  334 + if (begin_val != '') {
  335 + $(".begin_date").prop('checked', true);
  336 + }
  337 +
  338 + if (end_val != '') {
  339 + $(".end_date").prop('checked', true);
  340 + }
  341 +
  342 + {% if not pendencies_form.is_valid and pendencies_form.is_bound %}
  343 + $("#notifications").collapse('toggle');
  344 + {% endif %}
  345 + });
  346 +</script>
  347 +<script type="text/javascript" src="{% static 'js/resources.js' %}"></script>
0 348 \ No newline at end of file
... ...
youtube_video/templates/youtube/create.html 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +{% extends 'subjects/view.html' %}
  2 +
  3 +{% load static i18n django_bootstrap_breadcrumbs %}
  4 +
  5 +{% block style %}
  6 + {{block.super}}
  7 + <link rel="stylesheet" type="text/css" href="{% static "css/bootstrap-tagsinput.css" %}">
  8 +{% endblock %}
  9 +
  10 +{% block javascript %}
  11 + {{block.super}}
  12 + <script type="text/javascript" src="{% static "js/bootstrap-tagsinput.js" %} "></script>
  13 +{% endblock %}
  14 +
  15 +{% block breadcrumbs %}
  16 + {{ block.super }}
  17 +
  18 + {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %}
  19 +
  20 + {% trans 'Create YouTube Video' as bread %}
  21 + {% breadcrumb bread 'youtube:create' topic.slug %}
  22 +{% endblock %}
  23 +
  24 +{% block content %}
  25 + <div class="card">
  26 + <div class="card-content">
  27 + <div class="card-body">
  28 + {% include 'youtube/_form.html' %}
  29 + </div>
  30 + </div>
  31 + </div>
  32 + <br clear="all" />
  33 + <br clear="all" />
  34 +{% endblock %}
... ...
youtube_video/tests.py 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +from django.test import TestCase
  2 +
  3 +# Create your tests here.
... ...
youtube_video/urls.py 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +from django.conf.urls import url
  2 +from django.contrib.auth import views as auth_views
  3 +
  4 +from . import views
  5 +
  6 +urlpatterns = [
  7 + url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
  8 +]
... ...
youtube_video/views.py 0 → 100644
... ... @@ -0,0 +1,120 @@
  1 +from django.shortcuts import get_object_or_404, redirect, render
  2 +from django.views import generic
  3 +from django.contrib import messages
  4 +from django.core.urlresolvers import reverse, reverse_lazy
  5 +from django.utils.translation import ugettext_lazy as _
  6 +from django.contrib.auth.mixins import LoginRequiredMixin
  7 +
  8 +from amadeus.permissions import has_subject_permissions, has_resource_permissions
  9 +
  10 +from topics.models import Topic
  11 +
  12 +from .forms import YTVideoForm, InlinePendenciesFormset
  13 +from .models import YTVideo
  14 +
  15 +class CreateView(LoginRequiredMixin, generic.edit.CreateView):
  16 + login_url = reverse_lazy("users:login")
  17 + redirect_field_name = 'next'
  18 +
  19 + template_name = 'youtube/create.html'
  20 + form_class = YTVideoForm
  21 +
  22 + def dispatch(self, request, *args, **kwargs):
  23 + slug = self.kwargs.get('slug', '')
  24 + topic = get_object_or_404(Topic, slug = slug)
  25 +
  26 + if not has_subject_permissions(request.user, topic.subject):
  27 + return redirect(reverse_lazy('subjects:home'))
  28 +
  29 + return super(CreateView, self).dispatch(request, *args, **kwargs)
  30 +
  31 + def get(self, request, *args, **kwargs):
  32 + self.object = None
  33 +
  34 + form_class = self.get_form_class()
  35 + form = self.get_form(form_class)
  36 +
  37 + slug = self.kwargs.get('slug', '')
  38 + topic = get_object_or_404(Topic, slug = slug)
  39 +
  40 + pendencies_form = InlinePendenciesFormset(initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("finish", _("Finish"))]}])
  41 +
  42 + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
  43 +
  44 + def post(self, request, *args, **kwargs):
  45 + self.object = None
  46 +
  47 + form_class = self.get_form_class()
  48 + form = self.get_form(form_class)
  49 +
  50 + slug = self.kwargs.get('slug', '')
  51 + topic = get_object_or_404(Topic, slug = slug)
  52 +
  53 + pendencies_form = InlinePendenciesFormset(self.request.POST, initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("finish", _("Finish"))]}])
  54 +
  55 + if (form.is_valid() and pendencies_form.is_valid()):
  56 + return self.form_valid(form, pendencies_form)
  57 + else:
  58 + return self.form_invalid(form, pendencies_form)
  59 +
  60 + def get_initial(self):
  61 + initial = super(CreateView, self).get_initial()
  62 +
  63 + slug = self.kwargs.get('slug', '')
  64 +
  65 + topic = get_object_or_404(Topic, slug = slug)
  66 + initial['subject'] = topic.subject
  67 +
  68 + return initial
  69 +
  70 + def form_invalid(self, form, pendencies_form):
  71 + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
  72 +
  73 + def form_valid(self, form, pendencies_form):
  74 + self.object = form.save(commit = False)
  75 +
  76 + slug = self.kwargs.get('slug', '')
  77 + topic = get_object_or_404(Topic, slug = slug)
  78 +
  79 + self.object.topic = topic
  80 + self.object.order = topic.resource_topic.count() + 1
  81 +
  82 + if not self.object.topic.visible and not self.object.topic.repository:
  83 + self.object.visible = False
  84 +
  85 + self.object.save()
  86 +
  87 + pend_form = pendencies_form.save(commit = False)
  88 + pend_form.resource = self.object
  89 +
  90 + if not pend_form.action == "":
  91 + pend_form.save()
  92 +
  93 + return redirect(self.get_success_url())
  94 +
  95 + def get_context_data(self, **kwargs):
  96 + context = super(CreateView, self).get_context_data(**kwargs)
  97 +
  98 + context['title'] = _('Create Youtube Video')
  99 +
  100 + slug = self.kwargs.get('slug', '')
  101 + topic = get_object_or_404(Topic, slug = slug)
  102 +
  103 + context['topic'] = topic
  104 + context['subject'] = topic.subject
  105 +
  106 + return context
  107 +
  108 + def get_success_url(self):
  109 + 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))
  110 +
  111 + success_url = reverse_lazy('webpages:view', kwargs = {'slug': self.object.slug})
  112 +
  113 + if self.object.show_window:
  114 + self.request.session['resources'] = {}
  115 + self.request.session['resources']['new_page'] = True
  116 + self.request.session['resources']['new_page_url'] = reverse('webpages:window_view', kwargs = {'slug': self.object.slug})
  117 +
  118 + success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
  119 +
  120 + return success_url
0 121 \ No newline at end of file
... ...