def post(self, request, requestion, *args, **kwargs): context = self.get_context_data(requestion) form = self.get_confirm_form(self.transition.index, requestion=requestion, data=request.POST, initial={'transition': self.transition.index}) context.update({ 'form': form, 'requestion': requestion, 'redirect_to': self.redirect_to }) if form.is_valid(): pre_status_change.send(sender=Requestion, user=request.user, requestion=requestion, transition=self.transition, form=form) # Момент истины # если ModelForm, то сохраняем if isinstance(form.__class__, ModelFormMetaclass): requestion = form.save(commit=False) requestion.status = self.transition.dst requestion.save() form.save_m2m() else: requestion.status = self.transition.dst requestion.save() post_status_change.send(sender=Requestion, user=request.user, requestion=requestion, transition=self.transition, form=form) return HttpResponseRedirect(self.redirect_to) else: return self.render_to_response(context)
def post(self, request, requestion, *args, **kwargs): u"""По post-запросу применяем изменение статуса заявки. Autocommit отключаем, чтобы иметь возможность отображаеть сообщение об ошибке, виесто 500-й страницы. """ if request.POST.get("confirmation") == "no": messages.info(request, u"Статус заявки не был изменен") return HttpResponseRedirect(self.redirect_to) context = self.get_context_data(requestion) form = self.get_confirm_form( self.transition.index, requestion=requestion, data=request.POST, initial={"transition": self.transition.index}, ) context.update({"form": form, "requestion": requestion, "redirect_to": self.redirect_to}) if form.is_valid(): # если заявка не прошла pre_status_change - значит не соблюдены # какие-то условия try: pre_status_change.send( sender=Requestion, request=request, requestion=requestion, transition=self.transition, form=form ) except TransitionNotAllowed as e: messages.error(request, e.message) return HttpResponseRedirect(self.redirect_to) except Exception: raise # если ошибка возникла во время применения изменений, вероятно # нарушено целостное состояние системы try: # если ModelForm, то сохраняем if isinstance(form.__class__, ModelFormMetaclass): requestion = form.save(commit=False) requestion.status = self.transition.dst requestion.save() form.save_m2m() else: requestion.status = self.transition.dst requestion.save() post_status_change.send( sender=Requestion, request=request, requestion=requestion, transition=self.transition, form=form ) # если все прошло без ошибок - сохраняем # если возникли ошибки в ходе изменения статуса заявки - отображаем # и отменяем ранее запланированные изменения except TransitionNotRegistered as e: if e.requestion == requestion: messages.error(request, e.message) else: err_msg = ( u"Ошибка изменения статуса текущей заявки. " u"Вызвана заявкой {} с таким же идентифицирующим" u" документом".format(e.requestion) ) messages.error(request, err_msg) except TransitionNotAllowed as e: messages.error(request, e.message) except Exception: raise return HttpResponseRedirect(self.redirect_to) else: return self.render_to_response(context)
def post(self, request, *args, **kwargs): # Начальные значения status_code = STATUS_DATA_ERROR err_msg = None data = kwargs['data'] dst_status = int(data['dst_status']) requestion = Requestion.objects.get(pk=data['requestion_id']) # параноидальная проверка целостности данных if requestion.requestion_number != data['requestion_number']: err_msg = u"Ошибка проверки данных заявки: номер заявки отличается"\ u"от указанного в профиле" result = {'status_code': STATUS_DATA_ERROR, 'err_msg': { '__all__': err_msg, }} return self.render_to_response(result) if (requestion.status in [STATUS_DISTRIBUTED, STATUS_DISTRIBUTED_FROM_ES] and dst_status != STATUS_KG_LEAVE): err_msg = u"Заявка зачислена в Электроочереди, действие невозможно" if dst_status == STATUS_DISTRIBUTED_FROM_ES: err_msg = u"Заявка уже зачислена в Электроочереди" result = {'status_code': STATUS_ALREADY_DISTRIBUTED, 'err_msg': {'__all__': err_msg}} return self.render_to_response(result) transition_indexes = workflow.available_transitions( src=requestion.status, dst=dst_status) # TODO: Проверка на корректность ДОУ? # sadik = requestion.distributed_in_vacancy.sadik_group.sadik # Если в форме передается свидетельство о рождении и текущий # документ у заявки - временный, меняем if 'document_number' in data and requestion.evidience_documents()[0].fake: form_data = { 'template': data['template'], 'document_number': data['document_number'], } form = RequestionIdentityDocumentForm( instance=requestion, data=form_data) if form.is_valid(): form.save() requestion.evidience_documents().filter(fake=True).delete() else: err_msg = {} for error in form.errors: err_msg[error] = form.errors[error] result = {'status_code': status_code, 'err_msg': err_msg} return self.render_to_response(result) if transition_indexes: transition = workflow.get_transition_by_index(transition_indexes[0]) if transition.index in INNER_TRANSITIONS: if Requestion.objects.filter( id=requestion.id, status=transition.src).update( status=transition.dst): Logger.objects.create_for_action( transition.index, context_dict=data, extra={'obj': requestion}) status_code = STATUS_OK else: status_code = STATUS_DATA_ERROR err_msg = u"Проверьте статус заявки в Электроочереди" else: form = self.form(requestion=requestion, data={'reason': data.get('reason'), 'transition': transition.index, 'confirm': "yes"}, initial={'transition': transition.index}) if form.is_valid(): pre_status_change.send( sender=Requestion, request=request, requestion=requestion, transition=transition, form=form) requestion.status = transition.dst requestion.save() post_status_change.send( sender=Requestion, request=request, requestion=requestion, transition=transition, form=form) status_code = STATUS_OK else: err_msg = {} for error in form.errors: err_msg[error] = form.errors[error] else: err_msg = { '__all__': u"Невозможно изменить статус заявки в электроочереди" } result = {'status_code': status_code, 'err_msg': err_msg} return self.render_to_response(result)