views.py 9.7 KB
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 rolepermissions.verifications import has_role, has_object_permission
from .forms import FileForm, UpdateFileForm
from .models import TopicFile
from .utils import mime_type_to_material_icons
from courses.models import Topic

from core.decorators import log_decorator
from core.models import Log, MimeType
from core.mixins import LogMixin, NotificationMixin

from django.urls import reverse
from datetime import datetime


# Create your views here.

class CreateFile(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView):
	log_component = 'file'
	log_resource = 'file'
	log_action = 'create'
	log_component = {}

	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')

	log_component = "subject"
	log_resource = "file"
	log_action = "create"
	log_context = {}

	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
		
		self.object.name = str(self.object)
		

		# 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()
		#CREATE LOG 
		self.log_context['topic_id'] = topic.id
		self.log_context['topic_name'] = topic.name
		self.log_context['topic_slug'] = topic.slug
		self.log_context['subject_id'] = topic.subject.id
		self.log_context['subject_name'] = topic.subject.name
		self.log_context['subject_slug'] = topic.subject.slug

		super(CreateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)



		#CREATE NOTIFICATION
		super(CreateFile, self).createNotification(message="uploaded a File "+ self.object.name, actor=self.request.user,
			resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), 
			users=self.object.topic.subject.students.all())

		self.log_context['file_id'] = self.object.id
		self.log_context['file_name'] = self.object.name
		self.log_context['topic_id'] = self.object.topic.id
		self.log_context['topic_name'] = self.object.topic.name
		self.log_context['topic_slug'] = self.object.topic.slug
		self.log_context['subject_id'] = self.object.topic.subject.id
		self.log_context['subject_name'] = self.object.topic.subject.name
		self.log_context['subject_slug'] = self.object.topic.subject.slug
		self.log_context['course_id'] = self.object.topic.subject.course.id
		self.log_context['course_name'] = self.object.topic.subject.course.name
		self.log_context['course_slug'] = self.object.topic.subject.course.slug
		self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
		self.log_context['course_category_name'] = self.object.topic.subject.course.category.name

		super(CreateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)

		return self.get_success_url()

	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 = redirect('course:file:render_file', id = self.object.id)
		
		return self.success_url


#@log_decorator("topic","acessar","file")
def render_file(request, id):
	template_name = 'files/render_file.html'
	file = get_object_or_404(TopicFile, id = id)

	context = {
		'file': file
	}

	log_context = {}
	log_context['file_id'] = file.id
	log_context['file_name'] = file.name
	log_context['topic_id'] = file.topic.id
	log_context['topic_name'] = file.topic.name
	log_context['topic_slug'] = file.topic.slug
	log_context['subject_id'] = file.topic.subject.id
	log_context['subject_name'] = file.topic.subject.name
	log_context['subject_slug'] = file.topic.subject.slug
	log_context['course_id'] = file.topic.subject.course.id
	log_context['course_name'] = file.topic.subject.course.name
	log_context['course_slug'] = file.topic.subject.course.slug
	log_context['course_category_id'] = file.topic.subject.course.category.id
	log_context['course_category_name'] = file.topic.subject.course.category.name

	request.log_context = log_context

	return render(request, template_name, context)


class UpdateFile(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView):
	log_component = 'file'
	log_resource = 'file'
	log_action = 'update'
	log_context = {}

	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 dispatch(self, *args, **kwargs):
		file = get_object_or_404(TopicFile, slug = self.kwargs.get('slug'))
		if(not has_object_permission('edit_file', self.request.user, file) and not(self.request.user in file.topic.subject.professors.all())):
			return self.handle_no_permission()
		return super(UpdateFile, self).dispatch(*args, **kwargs)

	def form_valid(self, form):
		self.object = form.save()

		self.log_context['file_id'] = self.object.id
		self.log_context['file_name'] = self.object.name
		self.log_context['topic_id'] = self.object.topic.id
		self.log_context['topic_name'] = self.object.topic.name
		self.log_context['topic_slug'] = self.object.topic.slug
		self.log_context['subject_id'] = self.object.topic.subject.id
		self.log_context['subject_name'] = self.object.topic.subject.name
		self.log_context['subject_slug'] = self.object.topic.subject.slug
		self.log_context['course_id'] = self.object.topic.subject.course.id
		self.log_context['course_name'] = self.object.topic.subject.course.name
		self.log_context['course_slug'] = self.object.topic.subject.course.slug
		self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
		self.log_context['course_category_name'] = self.object.topic.subject.course.category.name

		super(UpdateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)

		return super(UpdateFile, self).form_valid(form)

	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, LogMixin, generic.DeleteView):
	log_component = 'file'
	log_resource = 'file'
	log_action = 'delete'
	log_context = {}

	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(self.request.user in file.topic.subject.professors.all()) and not(has_role(self.request.user, 'system_admin'))):
			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):
		self.log_context['file_id'] = self.object.id
		self.log_context['file_name'] = self.object.name
		self.log_context['topic_id'] = self.object.topic.id
		self.log_context['topic_name'] = self.object.topic.name
		self.log_context['topic_slug'] = self.object.topic.slug
		self.log_context['subject_id'] = self.object.topic.subject.id
		self.log_context['subject_name'] = self.object.topic.subject.name
		self.log_context['subject_slug'] = self.object.topic.subject.slug
		self.log_context['course_id'] = self.object.topic.subject.course.id
		self.log_context['course_name'] = self.object.topic.subject.course.name
		self.log_context['course_slug'] = self.object.topic.subject.course.slug
		self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
		self.log_context['course_category_name'] = self.object.topic.subject.course.category.name

		super(DeleteFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)

		return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug})