diff --git a/apps/file/admin.py b/apps/file/admin.py index cb8e61d6..8ffd08ac 100644 --- a/apps/file/admin.py +++ b/apps/file/admin.py @@ -4,12 +4,15 @@ 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 UpdateView +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 @@ -39,11 +42,12 @@ def ajax_post_file(request, 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': 'file', + '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]) }) @@ -66,13 +70,36 @@ def ajax_delete_file(request, id): return HttpResponse(json.dumps(data), content_type='application/json') -class FileUpdateView(UpdateView): +class FileUpdateView(FormView): """ Представление обновления файла """ template_name = 'c_admin/file/file_update.html' form_class = FileUpdateForm - model = FileModel + + 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.object.pk]) + 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 diff --git a/apps/file/forms.py b/apps/file/forms.py index c6d0c30a..9afb71ea 100644 --- a/apps/file/forms.py +++ b/apps/file/forms.py @@ -84,13 +84,46 @@ class FileForm(forms.Form): return file_obj -class FileUpdateForm(forms.ModelForm): +class FileUpdateForm(forms.Form): """ Форма обновления файла в админ панели """ - class Meta: - model = FileModel - fields = ('file_path',) + file_path = forms.FileField(label=_(u'Выберите файл')) + purpose = forms.ChoiceField(label=_(u'Назаначение'), choices=PURPOSES) + + def __init__(self, *args, **kwargs): + """ + Создаём динамические поля переводов + """ + super(FileUpdateForm, self).__init__(*args, **kwargs) + for lid, (code, name) in enumerate(settings.LANGUAGES): + self.fields['file_name_%s' % code] = forms.CharField( + label=_(u'Имя файла'), + required=False, + widget=forms.TextInput(attrs={'placeholder': 'Имя'}) + ) + self.fields['description_%s' % code] = forms.CharField( + label=_(u'Описание'), + required=False, + widget=CKEditorWidget() + ) + + def save(self, request, id=None): + data = self.cleaned_data + + if id is None: + f = FileModel() + else: + f = FileModel.objects.get(id=id) + + f.file_path = data['file_path'] + f.purpose = data['purpose'] + f.save() + + # fill translated fields and save object + fill_trans_fields_all(FileModel, f, data, id=id) + + return f class FileModelForm(forms.Form): diff --git a/requirements.txt b/requirements.txt index 42bb5813..f8fe67c1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,6 +44,7 @@ pymorphy2==0.8 pymorphy2-dicts==2.4.393442.3710985 pysolr==3.2.0 python-dateutil==2.2 +python-magic==0.4.12 python-memcached==1.48 python-openid==2.2.5 python-social-auth==0.1.23 diff --git a/templates/c_admin/file/file_update.html b/templates/c_admin/file/file_update.html index 401b5b33..3ee8d805 100644 --- a/templates/c_admin/file/file_update.html +++ b/templates/c_admin/file/file_update.html @@ -1,4 +1,9 @@ {% extends 'c_admin/base.html' %} +{% load static %} + +{% block scripts %} + +{% endblock %} {% block body %}