# -*- coding: utf-8 -*- from django.core.urlresolvers import reverse from django.views.decorators.csrf import csrf_exempt from django.db.models.loading import get_model from django.contrib.contenttypes.models import ContentType from django.http import HttpResponse from django.views.generic import FormView from django.shortcuts import get_object_or_404 from django.conf import settings from .models import FileModel from .forms import FileForm, FileUpdateForm import json import magic @csrf_exempt def ajax_post_file(request, obj_id): """ Takes file and file data and save it """ data = {'success': False} # takes data from hidden input "model" and initial Model Model = get_model(request.GET['model'].split('.')[0], request.GET['model'].split('.')[1]) # initial model object obj = Model.objects.get(id=obj_id) if request.is_ajax() and request.method == 'POST': file_form = FileForm(request.POST, request.FILES) if file_form.is_valid(): f = file_form.save(request.FILES, obj) mime = magic.Magic(mime=True) data['success'] = True data['name'] = f.file_name or f.file_path.name data['size'] = f.file_path.size data['file'] = f.file_path.url data['type'] = mime.from_file(f.file_path.path) data['remove_url'] = reverse('ajax_delete_file', args=[f.pk]) data['detail_link'] = reverse('file_update', args=[f.pk]) else: data['errors'] = file_form.errors if request.is_ajax() and request.method == 'GET': files = FileModel.objects.filter( content_type=ContentType.objects.get_for_model(obj), object_id=obj_id ) files_data = [] for f in files: mime = magic.Magic(mime=True) files_data.append({ 'name': f.file_name or f.file_path.name, 'size': f.file_path.size, 'file': f.file_path.url, 'type': mime.from_file(f.file_path.path), 'remove_url': reverse('ajax_delete_file', args=[f.pk]), 'detail_link': reverse('file_update', args=[f.pk]) }) data['success'] = True data['files'] = files_data return HttpResponse(json.dumps(data), content_type='application/json') def ajax_delete_file(request, id): """ delete file """ if request.is_ajax(): f = FileModel.objects.get(id=id) f.delete() data = {'success': True} else: data = {'success': False} return HttpResponse(json.dumps(data), content_type='application/json') class FileUpdateView(FormView): """ Представление обновления файла """ template_name = 'c_admin/file/file_update.html' form_class = FileUpdateForm def get_object(self): pk = self.kwargs.get('pk') return get_object_or_404(FileModel, pk=pk) def get_initial(self): data = super(FileUpdateView, self).get_initial() obj = self.get_object() data['file_path'] = obj.file_path data['purpose'] = obj.purpose for lid, (code, name) in enumerate(settings.LANGUAGES): data['file_name_%s' % code] = obj.file_name.translate(code) data['description_%s' % code] = obj.description.translate(code) return data def form_valid(self, form): form.save(self.request, self.kwargs.get('pk')) return super(FileUpdateView, self).form_valid(form) def get_success_url(self): return reverse('file_update', args=[self.get_object().pk]) def get_context_data(self, **kwargs): ctx = super(FileUpdateView, self).get_context_data(**kwargs) ctx['object'] = self.get_object() ctx['languages'] = settings.LANGUAGES return ctx