Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)