From 7483f021b06798af8114bb603a615429bf80fc34 Mon Sep 17 00:00:00 2001 From: Jailson Dias Date: Mon, 13 Mar 2017 21:49:13 -0300 Subject: [PATCH] Resolvendo bugs do tipo Um mesmo usuário pode ser professor e aluno ao mesmo tempo --- amadeus/static/js/mural.js | 20 ++++++++++---------- amadeus/templates/base.html | 39 ++++++++++++++++++++------------------- subjects/forms.py | 1 - subjects/templates/subjects/_form.html | 43 +++++++++++++++++++++++++++++++++++-------- subjects/views.py | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------- 5 files changed, 146 insertions(+), 102 deletions(-) diff --git a/amadeus/static/js/mural.js b/amadeus/static/js/mural.js index 8f8fb50..7fca9ab 100644 --- a/amadeus/static/js/mural.js +++ b/amadeus/static/js/mural.js @@ -32,7 +32,7 @@ function postHeightLimits() { if ($(this).outerHeight() > 500) { var post = $(this), btn = post.parent().find('.see-complete'); - + post.attr('style', 'overflow:hidden;max-height:500px'); btn.attr('style', 'display:block'); @@ -65,13 +65,13 @@ function setPostFormSubmit(post = "") { success: function (data) { if (post != "") { var old = $("#post-" + post); - + old.before(data.view); old.remove(); } else { $('.posts:visible').prepend(data.view); - + new_posts.push(data.new_id); $('.no-subjects:visible').attr('style', 'display:none'); @@ -95,7 +95,7 @@ function setPostFormSubmit(post = "") { return false; }); } - + function favorite(btn) { var action = btn.data('action'), url = btn.data('url'); @@ -121,7 +121,7 @@ function favorite(btn) { function editPost(btn) { var url = btn.data('url'); var post = btn.data('post'); - + $.ajax({ url: url, success: function (data) { @@ -163,7 +163,7 @@ function setPostDeleteSubmit (post) { $('#post-modal-form').modal('hide'); - alertify.success(response.msg); + alertify.success(response.msg); }, error: function (data) { console.log(data); @@ -194,7 +194,7 @@ function editComment(btn) { var url = btn.data('url'), post = btn.data('post'), comment = btn.data('id'); - + $.ajax({ url: url, success: function (data) { @@ -222,7 +222,7 @@ function setCommentFormSubmit(post, comment = "") { success: function (data) { if (comment != "") { var old = $("#comment-" + comment); - + old.before(data.view); old.remove(); @@ -285,7 +285,7 @@ function setCommentDeleteSubmit (comment) { $('#post-modal-form').modal('hide'); - alertify.success(response.msg); + alertify.success(response.msg); }, error: function (data) { console.log(data); @@ -327,4 +327,4 @@ function loadComments (btn) { btn.after(response.loaded); } }); -} \ No newline at end of file +} diff --git a/amadeus/templates/base.html b/amadeus/templates/base.html index b6ae1df..be9b321 100644 --- a/amadeus/templates/base.html +++ b/amadeus/templates/base.html @@ -1,6 +1,7 @@ {% load static i18n django_bootstrap_breadcrumbs %} +{% get_current_language as LANGUAGE_CODE %} @@ -27,7 +28,7 @@ - + @@ -46,7 +47,7 @@ - + {% block style %} {% endblock %} {% block javascript %} @@ -55,14 +56,14 @@ - + {% with 'css/themes/'|add:theme.css_style|add:'.css' as theme_selected %} {% endwith %} - + {% block nav %} @@ -288,11 +289,11 @@ - \ No newline at end of file + diff --git a/subjects/forms.py b/subjects/forms.py index cb7679a..46f168a 100644 --- a/subjects/forms.py +++ b/subjects/forms.py @@ -175,7 +175,6 @@ class UpdateSubjectForm(forms.ModelForm): def clean_subscribe_begin(self): subscribe_begin = self.cleaned_data['subscribe_begin'] - print (self.instance.subscribe_begin, "################################") if subscribe_begin < datetime.datetime.today().date() and subscribe_begin < self.instance.subscribe_begin: self._errors['subscribe_begin'] = [_('This date must be today or after')] return ValueError diff --git a/subjects/templates/subjects/_form.html b/subjects/templates/subjects/_form.html index f55af55..c296448 100644 --- a/subjects/templates/subjects/_form.html +++ b/subjects/templates/subjects/_form.html @@ -98,6 +98,9 @@ $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'; + // console.log($selectableSearch); + // alert("oi"); + // console.log($eselectableSearch); that.qs1 = $selectableSearch.quicksearch(selectableSearchString) .on('keydown', function(e){ @@ -115,11 +118,18 @@ } }); }, - afterSelect: function(){ - this.qs1.cache(); + afterSelect: function(values){ + $("#id_students option[value='" + values[0] + "']").remove(); + $('#id_students').multiSelect('refresh'); + + this.qs1.cache(); this.qs2.cache(); }, - afterDeselect: function(){ + afterDeselect: function(values){ + var label = $("#id_professor option[value='" + values[0] + "']").text(); + + $("#id_students").multiSelect('addOption', {value: values[0], text: label}); + this.qs1.cache(); this.qs2.cache(); } @@ -135,6 +145,7 @@ 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){ @@ -151,11 +162,21 @@ } }); }, - afterSelect: function(){ + // afterInit: function(){ + // + // }, + afterSelect: function(values){ + $("#id_professor option[value='" + values[0] + "']").remove(); + $('#id_professor').multiSelect('refresh'); + this.qs1.cache(); this.qs2.cache(); }, - afterDeselect: function(){ + afterDeselect: function(values){ + var label = $("#id_students option[value='" + values[0] + "']").text(); + + $("#id_professor").multiSelect('addOption', {value: values[0], text: label}); + this.qs1.cache(); this.qs2.cache(); } @@ -163,17 +184,23 @@ $('.collapse').on('show.bs.collapse', function (e) { if($(this).is(e.target)){ - var btn = $(this).parent().find('.fa-angle-right'); + // console.log(e); + var btn = $(this).parent().find('.fa-angle-right'); btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); - } + + $(this).parent().parent().parent().find('.panel-collapse.in').collapse('hide'); + } + + }); $('.collapse').on('hide.bs.collapse', function (e) { + // console.log(e); if($(this).is(e.target)){ var btn = $(this).parent().find('.fa-angle-down'); btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); } }); - \ No newline at end of file + diff --git a/subjects/views.py b/subjects/views.py index 1158e46..ebd90d9 100644 --- a/subjects/views.py +++ b/subjects/views.py @@ -40,7 +40,7 @@ class HomeView(LoginRequiredMixin, ListView): template_name = 'subjects/initial.html' context_object_name = 'subjects' paginate_by = 10 - total = 0 + total = 0 def get_queryset(self): if self.request.user.is_staff: @@ -49,7 +49,7 @@ class HomeView(LoginRequiredMixin, ListView): pk = self.request.user.pk subjects = Subject.objects.filter(Q(students__pk=pk) | Q(professor__pk=pk) | Q(category__coordinators__pk=pk)).distinct() - + self.total = subjects.count() return subjects @@ -58,7 +58,7 @@ class HomeView(LoginRequiredMixin, ListView): context = super(HomeView, self).get_context_data(**kwargs) context['title'] = _('Home') context['show_buttons'] = True #So it shows subscribe and access buttons - + #bringing users tag_amount = 50 tags = Tag.objects.all() @@ -68,14 +68,14 @@ class HomeView(LoginRequiredMixin, ListView): if Resource.objects.filter(tags__pk=tag.pk, students__pk = self.request.user.pk).count() > 0 or Subject.objects.filter(tags__pk = tag.pk).count() > 0: tags_list.append((tag.name, Subject.objects.filter(tags__pk = tag.pk).count())) tags_list.sort(key= lambda x: x[1], reverse=True) #sort by value - + elif len(tags_list) > tag_amount: count = Subject.objects.filter(tags__pk = tag.pk).count() if count > tags_list[tag_amount][1]: tags_list[tag_amount - 1] = (tag.name, count) tags_list.sort(key = lambda x: x[1], reverse=True) - + i = 0 tags = [] @@ -104,50 +104,50 @@ class IndexView(LoginRequiredMixin, ListView): context_object_name = 'categories' paginate_by = 10 - def get_queryset(self): + def get_queryset(self): self.totals['all_subjects'] = count_subjects(self.request.user) - + self.totals['my_subjects'] = self.totals['all_subjects'] - + if self.request.user.is_staff: categories = Category.objects.all().order_by('name') else: pk = self.request.user.pk - + self.totals['my_subjects'] = count_subjects(self.request.user, False) - + if not self.kwargs.get('option'): my_categories = Category.objects.filter(Q(coordinators__pk=pk) | Q(subject_category__professor__pk=pk) | Q(subject_category__students__pk = pk, visible = True)).distinct().order_by('name') - + categories = my_categories else: categories = Category.objects.filter(Q(coordinators__pk = pk) | Q(visible=True) ).distinct().order_by('name') - + #if not self.request.user.is_staff: - + #my_categories = [category for category in categories if self.request.user in category.coordinators.all() \ - #or has_professor_profile(self.request.user, category) or has_student_profile(self.request.user, category)] + #or has_professor_profile(self.request.user, category) or has_student_profile(self.request.user, category)] #So I remove all categories that doesn't have the possibility for the user to be on - + return categories - def paginate_queryset(self, queryset, page_size): + def paginate_queryset(self, queryset, page_size): paginator = self.get_paginator( queryset, page_size, orphans=self.get_paginate_orphans(), allow_empty_first_page=self.get_allow_empty()) - + page_kwarg = self.page_kwarg - + page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 - + if self.kwargs.get('slug'): categories = queryset paginator = Paginator(categories, self.paginate_by) page = get_category_page(categories, self.kwargs.get('slug'), self.paginate_by) - + try: page_number = int(page) except ValueError: @@ -155,7 +155,7 @@ class IndexView(LoginRequiredMixin, ListView): page_number = paginator.num_pages else: raise Http404(_("Page is not 'last', nor can it be converted to an int.")) - + try: page = paginator.page(page_number) return (paginator, page, page.object_list, page.has_other_pages()) @@ -174,7 +174,7 @@ class IndexView(LoginRequiredMixin, ListView): if self.request.is_ajax(): if self.request.user.is_staff: self.template_name = "categories/home_admin_content.html" - + return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs) @@ -186,7 +186,7 @@ class IndexView(LoginRequiredMixin, ListView): context['show_buttons'] = True #So it shows subscribe and access buttons context['totals'] = self.totals - + if self.kwargs.get('option'): context['all'] = True context['title'] = _('All Subjects') @@ -234,13 +234,13 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView): login_url = reverse_lazy('users:login') redirect_field_name = 'next' form_class = CreateSubjectForm - + success_url = reverse_lazy('subject:index') def dispatch(self, request, *args, **kwargs): if kwargs.get('subject_slug'): subject = get_object_or_404(Subject, slug = kwargs.get('subject_slug', '')) - + if not has_category_permissions(request.user, subject.category): return redirect(reverse_lazy('subjects:home')) @@ -249,15 +249,17 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView): if not has_category_permissions(request.user, category): return redirect(reverse_lazy('subjects:home')) - + return super(SubjectCreateView, self).dispatch(request, *args, **kwargs) - + def get_initial(self): initial = super(SubjectCreateView, self).get_initial() - + if self.kwargs.get('slug'): #when the user creates a subject initial['category'] = Category.objects.all().filter(slug=self.kwargs['slug']) + # print (initial) + # initial['professor'] = User.objects.all() if self.kwargs.get('subject_slug'): #when the user replicate a subject subject = get_object_or_404(Subject, slug = self.kwargs['subject_slug']) @@ -272,7 +274,7 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView): initial['end_date'] = subject.end_date initial['students'] = subject.students.all() initial['description_brief'] = subject.description_brief - + self.log_action = 'replicate' self.log_context['replicated_subject_id'] = subject.id @@ -284,35 +286,41 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView): def get_context_data(self, **kwargs): context = super(SubjectCreateView, self).get_context_data(**kwargs) context['title'] = _('Create Subject') - + try: + students_selected = context['form'].cleaned_data['students'].values_list('id',flat=True) + professors_selected = context['form'].cleaned_data['professor'].values_list('id',flat=True) + context['form'].fields['professor'].queryset = context['form'].fields['professor'].queryset.exclude(id__in=students_selected) + context['form'].fields['students'].queryset = context['form'].fields['students'].queryset.exclude(id__in=professors_selected) + except AttributeError: + pass if self.kwargs.get('slug'): context['slug'] = self.kwargs['slug'] - + if self.kwargs.get('subject_slug'): context['title'] = _('Replicate Subject') subject = get_object_or_404(Subject, slug = self.kwargs['subject_slug']) - + context['slug'] = subject.category.slug context['replicate'] = True context['subject'] = subject context['subjects_menu_active'] = 'subjects_menu_active' - + return context def form_valid(self, form): - + self.object = form.save() - + if self.kwargs.get('slug'): self.object.category = Category.objects.get(slug=self.kwargs['slug']) - + if self.kwargs.get('subject_slug'): subject = get_object_or_404(Subject, slug = self.kwargs['subject_slug']) self.object.category = subject.category - + self.object.save() self.log_context['category_id'] = self.object.category.id @@ -322,7 +330,7 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView): self.log_context['subject_name'] = self.object.name self.log_context['subject_slug'] = self.object.slug - super(SubjectCreateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + super(SubjectCreateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) return super(SubjectCreateView, self).form_valid(form) @@ -349,7 +357,7 @@ class SubjectUpdateView(LoginRequiredMixin, LogMixin, UpdateView): def dispatch(self, request, *args, **kwargs): subject = get_object_or_404(Subject, slug = kwargs.get('slug', '')) - + self.subject = subject if not has_subject_permissions(request.user, subject): return redirect(reverse_lazy('subjects:home')) @@ -357,10 +365,19 @@ class SubjectUpdateView(LoginRequiredMixin, LogMixin, UpdateView): def get_context_data(self, **kwargs): context = super(SubjectUpdateView, self).get_context_data(**kwargs) + try: + students_selected = context['form'].cleaned_data['students'].values_list('id',flat=True) + professors_selected = context['form'].cleaned_data['professor'].values_list('id',flat=True) + except AttributeError: + students_selected = self.subject.students.all().values_list('id',flat=True) + professors_selected = self.subject.professor.all().values_list('id',flat=True) + + context['form'].fields['professor'].queryset = context['form'].fields['professor'].queryset.exclude(id__in=students_selected) + context['form'].fields['students'].queryset = context['form'].fields['students'].queryset.exclude(id__in=professors_selected) context['title'] = _('Update Subject') context['template_extends'] = 'categories/home.html' context['subjects_menu_active'] = 'subjects_menu_active' - + return context def get_success_url(self): @@ -380,9 +397,9 @@ class SubjectUpdateView(LoginRequiredMixin, LogMixin, UpdateView): self.log_context['subject_slug'] = self.object.slug super(SubjectUpdateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) - + messages.success(self.request, _('The Subject "%s" was updated on "%s" Category successfully!')%(self.object.name, self.object.category.name )) - + return reverse_lazy('subjects:index') class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): @@ -390,7 +407,7 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): log_action = 'delete' log_resource = 'subject' log_context = {} - + login_url = reverse_lazy("users:login") redirect_field_name = 'next' model = Subject @@ -398,7 +415,7 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): def dispatch(self, request, *args, **kwargs): subject = get_object_or_404(Subject, slug = kwargs.get('slug', '')) - + if not has_subject_permissions(request.user, subject): return redirect(reverse_lazy('subjects:home')) @@ -419,11 +436,11 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): self.log_context['subject_id'] = self.object.id self.log_context['subject_name'] = self.object.name self.log_context['subject_slug'] = self.object.slug - + super(SubjectDeleteView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) messages.success(self.request, _('Subject "%s" removed successfully!')%(self.object.name)) - + return JsonResponse({'url':reverse_lazy('subjects:index')}) @@ -440,14 +457,14 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): return self.render_to_response(context) def post(self, *args, **kwargs): - + return self.delete(*args, **kwargs) def get_context_data(self, **kwargs): context = super(SubjectDeleteView, self).get_context_data(**kwargs) subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) context['subject'] = subject - + if (self.request.GET.get('view') == 'index'): context['index'] = True else: @@ -465,9 +482,9 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): super(SubjectDeleteView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) - + messages.success(self.request, _('Subject "%s" removed successfully!')%(self.object.name)) - + return reverse_lazy('subjects:index') @@ -556,7 +573,7 @@ class SubjectSubscribeView(LoginRequiredMixin, LogMixin, TemplateView): subject.students.add(request.user) subject.save() messages.success(self.request, _('Subscription was successfull!')) - + return JsonResponse({'url':reverse_lazy('subjects:index')}) @@ -582,11 +599,11 @@ class SubjectSearchView(LoginRequiredMixin, LogMixin, ListView): if tags[0] == '': return HttpResponseRedirect(request.META.get('HTTP_REFERER')) - + return super(SubjectSearchView, self).dispatch(request, *args, **kwargs) - + def get_queryset(self): - + tags = self.request.GET.get('search') self.tags = tags @@ -595,23 +612,23 @@ class SubjectSearchView(LoginRequiredMixin, LogMixin, ListView): for tag in tags: for word in tag.split(' '): q = q | Q(tags__name__unaccent__iexact=word ) - + subjects = Subject.objects.filter(q).distinct() - + self.resources = Resource.objects.select_related('link', 'filelink', 'webpage', 'ytvideo', 'pdffile').filter(q).distinct() self.resources = [resource.id for resource in self.resources if has_resource_permissions(self.request.user, resource)] self.resources = Resource.objects.select_related('link', 'filelink', 'webpage', 'ytvideo', 'pdffile').filter(id__in = self.resources) - + self.totals = {'resources': self.resources.count(), 'my_subjects': subjects.count()} - + option = self.kwargs.get('option') if option and option == 'resources': return self.resources return subjects - + def get_context_data(self, **kwargs): context = super(SubjectSearchView, self).get_context_data(**kwargs) - + if self.totals['resources'] == 0 and self.totals['my_subjects'] == 0: context['empty'] = True context['tags'] = self.tags @@ -632,7 +649,7 @@ class SubjectSearchView(LoginRequiredMixin, LogMixin, ListView): super(SubjectSearchView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) return context - + @log_decorator_ajax('subject', 'view', 'subject') def subject_view_log(request, subject): action = request.GET.get('action') @@ -670,15 +687,15 @@ def most_acessed_subjects(request): subjects = {} for datum in data: if datum.context: - subject_id = datum.context['subject_id'] + subject_id = datum.context['subject_id'] if subject_id in subjects.keys(): subjects[subject_id]['count'] = subjects[subject_id]['count'] + 1 else: subjects[subject_id] = {'name': datum.context['subject_name'], 'count':0 } - + #order the values of the dictionary by the count in descendent order - subjects = sorted(subjects.values(), key = lambda x: x['count'], reverse=True ) + subjects = sorted(subjects.values(), key = lambda x: x['count'], reverse=True ) subjects = subjects[:30] return JsonResponse(subjects, safe=False) -- libgit2 0.21.2