diff --git a/amadeus/static/js/resources.js b/amadeus/static/js/resources.js index 253894e..575d58b 100644 --- a/amadeus/static/js/resources.js +++ b/amadeus/static/js/resources.js @@ -2,35 +2,35 @@ $('#id_groups').multiSelect({ selectableHeader: "", selectionHeader: "", afterInit: function(ms){ - var that = this, - $selectableSearch = that.$selectableUl.prev(), - $selectionSearch = that.$selectionUl.prev(), - selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)', - selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected'; - - that.qs1 = $selectableSearch.quicksearch(selectableSearchString) - .on('keydown', function(e){ - if (e.which === 40){ - that.$selectableUl.focus(); - return false; - } - }); - - that.qs2 = $selectionSearch.quicksearch(selectionSearchString) - .on('keydown', function(e){ - if (e.which == 40){ - that.$selectionUl.focus(); - return false; - } - }); + var that = this, + $selectableSearch = that.$selectableUl.prev(), + $selectionSearch = that.$selectionUl.prev(), + selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)', + selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected'; + + that.qs1 = $selectableSearch.quicksearch(selectableSearchString) + .on('keydown', function(e){ + if (e.which === 40){ + that.$selectableUl.focus(); + return false; + } + }); + + that.qs2 = $selectionSearch.quicksearch(selectionSearchString) + .on('keydown', function(e){ + if (e.which == 40){ + that.$selectionUl.focus(); + return false; + } + }); }, afterSelect: function(){ - this.qs1.cache(); - this.qs2.cache(); + this.qs1.cache(); + this.qs2.cache(); }, afterDeselect: function(){ - this.qs1.cache(); - this.qs2.cache(); + this.qs1.cache(); + this.qs2.cache(); } });// Used to create multi-select css style @@ -38,52 +38,52 @@ $('#id_students').multiSelect({ selectableHeader: "", selectionHeader: "", afterInit: function(ms){ - var that = this, - $selectableSearch = that.$selectableUl.prev(), - $selectionSearch = that.$selectionUl.prev(), - selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)', - selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected'; - - that.qs1 = $selectableSearch.quicksearch(selectableSearchString) - .on('keydown', function(e){ - if (e.which === 40){ - that.$selectableUl.focus(); - return false; - } - }); - - that.qs2 = $selectionSearch.quicksearch(selectionSearchString) - .on('keydown', function(e){ - if (e.which == 40){ - that.$selectionUl.focus(); - return false; - } - }); + var that = this, + $selectableSearch = that.$selectableUl.prev(), + $selectionSearch = that.$selectionUl.prev(), + selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)', + selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected'; + + that.qs1 = $selectableSearch.quicksearch(selectableSearchString) + .on('keydown', function(e){ + if (e.which === 40){ + that.$selectableUl.focus(); + return false; + } + }); + + that.qs2 = $selectionSearch.quicksearch(selectionSearchString) + .on('keydown', function(e){ + if (e.which == 40){ + that.$selectionUl.focus(); + return false; + } + }); }, afterSelect: function(){ - this.qs1.cache(); - this.qs2.cache(); + this.qs1.cache(); + this.qs2.cache(); }, afterDeselect: function(){ - this.qs1.cache(); - this.qs2.cache(); + this.qs1.cache(); + this.qs2.cache(); } });// Used to create multi-select css style $('.collapse').on('show.bs.collapse', function (e) { if($(this).is(e.target)){ - var btn = $(this).parent().find('.fa-angle-right'); + var btn = $(this).parent().find('.fa-angle-right'); - btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); - } + btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); + } }); $('.collapse').on('hide.bs.collapse', function (e) { if($(this).is(e.target)){ - var btn = $(this).parent().find('.fa-angle-down'); + var btn = $(this).parent().find('.fa-angle-down'); - btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); - } + btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); + } }); $('.begin_date_input').on('click', function () { diff --git a/pendencies/models.py b/pendencies/models.py index 396f79d..04e032a 100644 --- a/pendencies/models.py +++ b/pendencies/models.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from topics.models import Resource class Pendencies(models.Model): - action = models.CharField(_('Action'), max_length = 100, choices = (("view", _("Visualize")), ("create", _("Create")), ("answer", _("Answer")), ("access", _("Access"))), blank = True) + action = models.CharField(_('Action'), max_length = 100, choices = (("view", _("Visualize")), ("create", _("Create")), ("answer", _("Answer")), ("access", _("Access")), ("finish", _("Finish"))), blank = True) begin_date = models.DateTimeField(_('Begin Date'), null = True, blank = True) end_date = models.DateTimeField(_('End Date'), null = True, blank = True) limit_date = models.DateTimeField(_('Limit Date'), null = True, blank = True) diff --git a/youtube_video/forms.py b/youtube_video/forms.py index 4a8d253..3a123a5 100644 --- a/youtube_video/forms.py +++ b/youtube_video/forms.py @@ -12,6 +12,7 @@ from .models import YTVideo class YTVideoForm(forms.ModelForm): subject = None + control_subject = forms.CharField(widget = forms.HiddenInput()) def __init__(self, *args, **kwargs): super(YTVideoForm, self).__init__(*args, **kwargs) @@ -22,6 +23,8 @@ class YTVideoForm(forms.ModelForm): self.subject = self.instance.topic.subject self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) + self.initial['control_subject'] = self.subject.id + self.fields['students'].queryset = self.subject.students.all() self.fields['groups'].queryset = self.subject.group_subject.all() diff --git a/youtube_video/models.py b/youtube_video/models.py index 1b939ec..bc10eed 100644 --- a/youtube_video/models.py +++ b/youtube_video/models.py @@ -20,7 +20,7 @@ class YTVideo(Resource): return 'webpages:view' def update_link(self): - return 'webpages:update' + return 'youtube:update' def delete_link(self): return 'webpages:delete' diff --git a/youtube_video/templates/youtube/_form.html b/youtube_video/templates/youtube/_form.html index 4615924..e0700a9 100644 --- a/youtube_video/templates/youtube/_form.html +++ b/youtube_video/templates/youtube/_form.html @@ -102,98 +102,104 @@
- -
-
- {% render_field pendencies_form.id %} - {% render_field pendencies_form.resource %} - {% render_field pendencies_form.subject class='pend_subj' %} - -
- -
- {% render_field pendencies_form.action class='form-control' %} -
+ {{ pendencies_form.management_form }} + {{ pendencies_form.non_form_errors }} -
+ {% for notify in pendencies_form %} +
+
+ {% render_field notify.id %} + {% render_field notify.resource %} + {% render_field notify.subject class='pend_subj' %} + + {% if notify.instance.pk %}{{ notify.DELETE }}{% endif %} + +
+ +
+ {% render_field notify.action class='form-control' %} +
- {{ pendencies_form.action.help_text }} - - {% if pendencies_form.action.errors %} - - {% endif %} -
-
-
-
-

{% trans 'Wished period' %}:

-
-
-
-
- -
-
- {% render_field pendencies_form.begin_date class='form-control datetime-picker begin_date_input' %} -
-
-
- {{ pendencies_form.begin_date.help_text }} - - {% if pendencies_form.begin_date.errors %} - - {% endif %} -
-
-
- -
-
- {% render_field pendencies_form.end_date class='form-control datetime-picker end_date_input' %} -
-
-
- {{ pendencies_form.end_date.help_text }} - - {% if pendencies_form.end_date.errors %} - - {% endif %} -
+
+ + {{ notify.action.help_text }} + + {% if notify.action.errors %} + + {% endif %} +
+
+
+
+

{% trans 'Wished period' %}:

+
+
+
+
+ +
+
+ {% render_field notify.begin_date class='form-control datetime-picker begin_date_input' %} +
+
+
+ {{ notify.begin_date.help_text }} + + {% if notify.begin_date.errors %} + + {% endif %} +
+
+
+ +
+
+ {% render_field notify.end_date class='form-control datetime-picker end_date_input' %} +
+
+
+ {{ notify.end_date.help_text }} + + {% if notify.end_date.errors %} + + {% endif %} +
+
-
+ {% endfor %}
@@ -328,6 +334,33 @@ + {% endblock %} {% block breadcrumbs %} diff --git a/youtube_video/templates/youtube/update.html b/youtube_video/templates/youtube/update.html new file mode 100644 index 0000000..6fcb12d --- /dev/null +++ b/youtube_video/templates/youtube/update.html @@ -0,0 +1,37 @@ +{% extends 'subjects/view.html' %} + +{% load static i18n django_bootstrap_breadcrumbs %} + +{% block style %} + {{block.super}} + +{% endblock %} + +{% block javascript %} + {{block.super}} + + +{% endblock %} + +{% block breadcrumbs %} + {{ block.super }} + + {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %} + + {% trans 'Edit: ' as bread %} + {% with bread|add:youtube.name as bread_slug %} + {% breadcrumb bread_slug 'youtube:update' topic.slug youtube.slug %} + {% endwith %} +{% endblock %} + +{% block content %} +
+
+
+ {% include 'youtube/_form.html' %} +
+
+
+
+
+{% endblock %} diff --git a/youtube_video/urls.py b/youtube_video/urls.py index 67e6698..76882fb 100644 --- a/youtube_video/urls.py +++ b/youtube_video/urls.py @@ -5,4 +5,5 @@ from . import views urlpatterns = [ url(r'^create/(?P[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), + url(r'^update/(?P[\w_-]+)/(?P[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), ] diff --git a/youtube_video/views.py b/youtube_video/views.py index d1acb23..80743e5 100644 --- a/youtube_video/views.py +++ b/youtube_video/views.py @@ -84,11 +84,14 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): self.object.save() - pend_form = pendencies_form.save(commit = False) - pend_form.resource = self.object + pendencies_form.instance = self.object + pendencies_form.save(commit = False) - if not pend_form.action == "": - pend_form.save() + for pform in pendencies_form.forms: + pend_form = pform.save(commit = False) + + if not pend_form.action == "": + pend_form.save() return redirect(self.get_success_url()) @@ -108,13 +111,109 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): def get_success_url(self): 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)) - success_url = reverse_lazy('webpages:view', kwargs = {'slug': self.object.slug}) + #success_url = reverse_lazy('webpages:view', kwargs = {'slug': self.object.slug}) + + #if self.object.show_window: + # self.request.session['resources'] = {} + # self.request.session['resources']['new_page'] = True + # self.request.session['resources']['new_page_url'] = reverse('webpages:window_view', kwargs = {'slug': self.object.slug}) + + success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) + + return success_url + +class UpdateView(LoginRequiredMixin, generic.UpdateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'youtube/update.html' + model = YTVideo + form_class = YTVideoForm + context_object_name = 'youtube' + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + if not has_subject_permissions(request.user, topic.subject): + return redirect(reverse_lazy('subjects:home')) + + return super(UpdateView, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(instance=self.object, initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("finish", _("Finish"))]}]) + + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form)) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(self.request.POST, instance = self.object, initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("finish", _("Finish"))]}]) + + if (form.is_valid() and pendencies_form.is_valid()): + return self.form_valid(form, pendencies_form) + else: + return self.form_invalid(form, pendencies_form) + + def form_invalid(self, form, pendencies_form): + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form)) + + def form_valid(self, form, pendencies_form): + self.object = form.save(commit = False) + + if not self.object.topic.visible and not self.object.topic.repository: + self.object.visible = False + + self.object.save() + + pendencies_form.instance = self.object + pendencies_form.save(commit = False) + + for form in pendencies_form.forms: + pend_form = form.save(commit = False) + + if not pend_form.action == "": + pend_form.save() + + return redirect(self.get_success_url()) + + def get_context_data(self, **kwargs): + context = super(UpdateView, self).get_context_data(**kwargs) + + context['title'] = _('Update YouTube Video') + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + context['topic'] = topic + context['subject'] = topic.subject + + return context + + def get_success_url(self): + messages.success(self.request, _('The YouTube Video "%s" was updated successfully!')%(self.object.name)) + + #success_url = reverse_lazy('webpages:view', kwargs = {'slug': self.object.slug}) - if self.object.show_window: - self.request.session['resources'] = {} - self.request.session['resources']['new_page'] = True - self.request.session['resources']['new_page_url'] = reverse('webpages:window_view', kwargs = {'slug': self.object.slug}) + #if self.object.show_window: + # self.request.session['resources'] = {} + # self.request.session['resources']['new_page'] = True + # self.request.session['resources']['new_page_url'] = reverse('webpages:window_view', kwargs = {'slug': self.object.slug}) - success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) + success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) return success_url \ No newline at end of file -- libgit2 0.21.2