You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.8 KiB
112 lines
3.8 KiB
# -*- 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
|
|
|