+
+
+ {% csrf_token %} +
+
+
+
Название проекта
+ + Обязательно + +
+
+
+
Стоимость готового проекта + +
+ +
+
+
+
+
Тип готовой работы
+ + Обязательно +
+
+
+
Нет нужной специальности хочу добавить +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
Подробно опишите проект + +
+ + Обязательно + -{% block js_block %} +
+
+
+
+

прикрепить файл

+
+ ДО 100 ФАЙЛОВ +
- +
+ {% include 'partials/footer.html' %} + + {% include 'partials/inc-message-popup.html' %} +
+{% endblock %} +{% block old_js %} + + + + + + {% endblock %} +{% block js_block %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/work_sell/urls.py b/work_sell/urls.py index 8f64826..0d9a947 100644 --- a/work_sell/urls.py +++ b/work_sell/urls.py @@ -5,7 +5,8 @@ from .views import ( WorkSellUpdateView, WorkSellDeleteView, UploadView, - work_sell_create, + # work_sell_create, + WorkSellCreateView, BasicCreateView, PictureCreateView, ContractorWorkSellTrashView, @@ -17,12 +18,12 @@ app_name = 'work_sell' urlpatterns = [ urls.url(r'^$', WorkSellFilterView.as_view(), name='list'), - # urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'), + urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'), urls.url(r'^upload/$', UploadView.as_view(), name='upload'), urls.url(r'^(?P\d+)/edit/$', WorkSellUpdateView.as_view(), name='edit'), urls.url(r'^(?P\d+)/delete/$', WorkSellDeleteView.as_view(), name='delete'), urls.url(r'^(?P\d+)/trash/$', ContractorWorkSellTrashView.as_view(), name='contractor-worksell-trash'), - urls.url(r'^create/$', work_sell_create, name='create'), + # urls.url(r'^create/$', work_sell_create, name='create'), urls.url(r'^basic/$', BasicCreateView.as_view(), name='upload-basic'), urls.url(r'^new/$', PictureCreateView.as_view(), name='upload-new'), urls.url(r'^(?P\d+)/$', WorkSellDetail.as_view(), name='detail'), diff --git a/work_sell/views.py b/work_sell/views.py index bbc1fe0..5bcad35 100644 --- a/work_sell/views.py +++ b/work_sell/views.py @@ -12,13 +12,15 @@ from django.contrib import messages from django.db.models import Q from django.core.urlresolvers import reverse from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.core.exceptions import PermissionDenied from django.http import JsonResponse, HttpResponse, HttpResponseForbidden from django.core.files.base import ContentFile from django.views.generic import ListView, DetailView, CreateView, View, \ UpdateView, DeleteView, TemplateView from projects.models import BuildingClassfication, ConstructionType -from .models import WorkSell, Picture, WorkSellPhoto +from projects.forms import ProjectWorkTypeSuggestionForm +from .models import WorkSell, Picture, WorkSellPhoto, WorkSellPhoto from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm from .serialize import serialize from .response import JSONResponse, response_mimetype @@ -143,33 +145,92 @@ class WorkSellDetail(DetailView): return context -def work_sell_create(request): - if request.is_ajax(): - form = WorkSellForm(data=request.POST) +# def work_sell_create(request): +# if request.is_ajax(): +# form = WorkSellForm(data=request.POST) +# if form.is_valid(): +# instance = form.save(commit=False) +# # import code; code.interact(local=dict(globals(), **locals())) +# instance.save() +# form.save_m2m() +# images_ids = request.POST.get('images-ids').split(';')[:-1] +# for pk in images_ids: +# picture = Picture.objects.get(pk=pk) +# temp_file = ContentFile(picture.file.read()) +# temp_file.name = picture.file.name +# w_photo = WorkSellPhoto() +# w_photo.img = temp_file +# w_photo.worksell = instance +# w_photo.save() +# data = {'status': 'ok'} +# else: +# data = {'status': 'no', 'form_errors': form.errors} +# return HttpResponse(json.dumps(data), content_type='application/json') + + +class WorkSellCreateView(BaseMixin, View): + model = WorkSell + form_class = WorkSellForm + work_type_suggestion_form = ProjectWorkTypeSuggestionForm + template_name = 'worksell_create.html' + + def dispatch(self, request, *args, **kwargs): + if request.user.is_authenticated() and request.user.is_contractor(): + return super().dispatch(request, *args, **kwargs) + else: + raise PermissionDenied + + def get(self, request, *args, **kwargs): + context = self.get_context_data(**_.merge({}, request.GET, kwargs)) + + form = self.form_class(request=request) + work_type_suggestion_form = self.work_type_suggestion_form(request=request, prefix='work_type_suggestion') + + context.update({ + 'form': form, + 'work_type_suggestion_form': work_type_suggestion_form, + }) + + return render(request, self.template_name, context) + + def post(self, request, *args, **kwargs): + form = self.form_class(request.POST, request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below + # TODO: fix it on front + # Если фронт не будет возвращать пустую строку при незаполненных данных, то if'ы будут не нужны + if request.POST.get('specializations') == "": + request.POST.pop('specializations') + else: + request.POST.setlist('specializations', request.POST.get('specializations', "").split(',')) + + if request.POST.get('el_format') == "": + request.POST.pop('el_format') + else: + request.POST.setlist('el_format', request.POST.get('el_format', "").split(',')) + + print("POST before = ", request.POST) if form.is_valid(): - instance = form.save(commit=False) - # import code; code.interact(local=dict(globals(), **locals())) - instance.save() + work_sell = form.save(commit=False) + work_sell.contractor = request.user + work_sell.save() form.save_m2m() - images_ids = request.POST.get('images-ids').split(';')[:-1] - for pk in images_ids: - picture = Picture.objects.get(pk=pk) - temp_file = ContentFile(picture.file.read()) - temp_file.name = picture.file.name - w_photo = WorkSellPhoto() - w_photo.img = temp_file - w_photo.worksell = instance - w_photo.save() - data = {'status': 'ok'} - else: - data = {'status': 'no', 'form_errors': form.errors} - return HttpResponse(json.dumps(data), content_type='application/json') + for file, desc in zip(request.FILES.getlist('new_files'), request.POST.getlist('img_description')): + WorkSellPhoto.objects.create(img=file, description=desc, worksell=work_sell) -class WorkSellCreateView(CreateView): - model = WorkSell - form_class = WorkSellForm - template_name = 'worksell_create.html' + messages.info(request, 'Работа успешно создана') + redirect_to = reverse('work_sell:detail', kwargs={'pk': work_sell.pk}) + return redirect(redirect_to) + else: + if form.errors: + messages.info(request, ( + '

Произошла ошибка (form)

' + '
{form}
' + ).format(form=pformat(form.errors))) + + context = self.get_context_data(**kwargs) + context.update({'form': form}) + # context.update({'photos': WorkSellPhoto.objects.filter(worksell__id=)}) + return render(request, self.template_name, context) class WorkSellUpdateView(UpdateView):