From 6a795934c1dcd96333565c96713590f6c82e5dd4 Mon Sep 17 00:00:00 2001 From: ailsoncgt Date: Mon, 17 Oct 2016 22:50:24 -0300 Subject: [PATCH] View for file app & admin #132 --- files/admin.py | 4 +++- files/views.py | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 2 deletions(-) diff --git a/files/admin.py b/files/admin.py index 8c38f3f..6cde550 100644 --- a/files/admin.py +++ b/files/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin -# Register your models here. +from .models import TopicFile + +admin.site.register(TopicFile) \ No newline at end of file diff --git a/files/views.py b/files/views.py index 91ea44a..c03aabd 100644 --- a/files/views.py +++ b/files/views.py @@ -1,3 +1,131 @@ -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404, redirect +from django.conf import settings +from django.views import generic +from django.contrib import messages +from django.core.urlresolvers import reverse_lazy +from django.contrib.auth.mixins import LoginRequiredMixin +from rolepermissions.mixins import HasRoleMixin +from .forms import FileForm, UpdateFileForm +from .models import TopicFile +from .utils import mime_type_to_material_icons +from courses.models import Topic +from core.models import MimeType # Create your views here. +class CreateFile(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): + allowed_roles = ['professor', 'system_admin'] + login_url = reverse_lazy("core:home") + redirect_field_name = 'next' + model = TopicFile + template_name = 'files/create_file.html' + form_class = FileForm + success_url = reverse_lazy('course:file:render_file') + + def form_invalid(self, form, **kwargs): + context = super(CreateFile, self).form_invalid(form) + context.status_code = 400 + + return context + + def form_valid(self, form): + self.object = form.save(commit = False) + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) + self.object.topic = topic + # Set MimeType + file = self.request.FILES['file_url'] + try: + if file: + file_type = file.content_type + + # Check if exist a mimetype in database + try: + self.object.file_type = MimeType.objects.get(typ = file_type) + # Create if not + except: + mtype = MimeType.objects.create( + typ = file_type, + icon = mime_type_to_material_icons[file_type] + ) + mtype.save() + self.object.file_type = mtype + except: + print('File not uploaded') + # self.object.file_type = MimeType.objects.get(id = 1) + + self.object.save() + + return self.render_to_response(self.get_context_data(form = form), status = 200) + + def get_context_data(self, **kwargs): + context = super(CreateFile, self).get_context_data(**kwargs) + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) + context["topic"] = topic + context['subject'] = topic.subject + context['subjects'] = topic.subject.course.subjects.all() + try: + context['latest_file'] = TopicFile.objects.latest('id') + except: + pass + return context + + def get_success_url(self): + self.success_url = reverse('course:file:render_file', args = (self.object.id, )) + + return self.success_url + +def render_file(request, id): + template_name = 'files/render_file.html' + context = { + 'file': get_object_or_404(TopicFile, id = id) + } + return render(request, template_name, context) + + +class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): + allowed_roles = ['professor', 'system_admin'] + login_url = reverse_lazy("core:home") + redirect_field_name = 'next' + model = TopicFile + template_name = 'files/update_file.html' + form_class = UpdateFileForm + context_object_name = 'file' + success_url = reverse_lazy('course:file:render_file') + + def form_invalid(self, form, **kwargs): + context = super(UpdateFile, self).form_invalid(form) + context.status_code = 400 + + return context + + def get_object(self, queryset=None): + return get_object_or_404(TopicFile, slug = self.kwargs.get('slug')) + + def get_success_url(self): + self.success_url = reverse_lazy('course:file:render_file', args = (self.object.id, )) + + return self.success_url + + +class DeleteFile(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): + allowed_roles = ['professor', 'system_admin'] + login_url = reverse_lazy("core:home") + redirect_field_name = 'next' + model = TopicFile + template_name = 'files/delete_file.html' + + def dispatch(self, *args, **kwargs): + file = get_object_or_404(TopicFile, slug = self.kwargs.get('slug')) + if(not (file.topic.owner == self.request.user)): + return self.handle_no_permission() + return super(DeleteFile, self).dispatch(*args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(DeleteFile, self).get_context_data(**kwargs) + context['course'] = self.object.topic.subject.course + context['subject'] = self.object.topic.subject + context['file'] = self.object + context["topic"] = self.object.topic + return context + + def get_success_url(self): + return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) \ No newline at end of file -- libgit2 0.21.2