Пример #1
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano

        # check generico sul piano
        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        # check specifico azione
        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        # check risorsa
        if not _procedura_vas.risorse\
                .filter(tipo=TipoRisorsa.DOCUMENTO_PRELIMINARE_VAS.value, archiviata=False, user=info.context.user)\
                .exists():
            return GraphQLError("Risorsa mancante: {}".format(
                TipoRisorsa.DOCUMENTO_PRELIMINARE_VAS.value),
                                code=409)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info.context.user)

            return InvioDocPreliminare(procedura_vas_aggiornata=_procedura_vas,
                                       errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #2
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.AC):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            errs = []

            if not _procedura_vas.risorse\
                    .filter(tipo=TipoRisorsa.PARERE_AC.value, archiviata=False, user=info.context.user)\
                    .exists():
                return GraphQLError("File relativo al pareri AC mancante",
                                    code=409)

            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info.context.user)

            return TrasmissionePareriAC(vas_aggiornata=_procedura_vas,
                                        errors=errs)
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #3
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.AC):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        if not _procedura_vas.pubblicazione_provvedimento_verifica_ac:
            return GraphQLError("URL di pubblicazione non impostata", code=409)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info)

            return PubblicazioneProvvedimentoVerificaAc(
                vas_aggiornata=_procedura_vas, errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
    def mutate_and_get_payload(cls, root, info, **input):
        _procedura_approvazione = ProceduraApprovazione.objects.get(
            uuid=input['uuid'])
        _procedura_approvazione_data = input.get('procedura_approvazione')
        _piano = _procedura_approvazione.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        for fixed_field in ['uuid', 'piano', 'data_creazione', 'ente']:
            if fixed_field in _procedura_approvazione_data:
                logger.warning(
                    'Il campo "{}" non può essere modificato'.format(
                        fixed_field))
                _procedura_approvazione_data.pop(fixed_field)

        try:
            procedura_approvazione_aggiornata = update_create_instance(
                _procedura_approvazione, _procedura_approvazione_data)

            return cls(procedura_approvazione_aggiornata=
                       procedura_approvazione_aggiornata)
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #5
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.AC):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            if not _procedura_vas.risorse \
                    .filter(tipo=TipoRisorsa.DOCUMENTO_PRELIMINARE_VERIFICA_VAS.value, archiviata=False) \
                    .exists():
                return GraphQLError("File mancante: {}".format(
                    TipoRisorsa.DOCUMENTO_PRELIMINARE_VERIFICA_VAS.value),
                                    code=409)

            if not SoggettoOperante.get_by_qualifica(_piano, Qualifica.SCA).exists() and \
                    not Delega.objects.filter(qualifica=Qualifica.SCA, delegante__piano=_piano).exists():
                return GraphQLError("Non sono associati SCA al piano",
                                    code=409)

            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info.context.user)

            return InvioPareriVerificaVAS(vas_aggiornata=_procedura_vas,
                                          errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
    def mutate(cls, root, info, file, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Not Authorized - Utente non riconosciuto", code=401)

        # Fetching input arguments
        _codice_piano = input['codice']
        _tipo_file = input['tipo_file']

        try:
            # Validating 'Piano'
            _piano = Piano.objects.get(codice=_codice_piano)  # TODO 404

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            _resources = UploadBaseBase.handle_uploaded_data(
                file,
                _codice_piano,
                _piano.fase,
                _tipo_file,
                info.context.user
            )
            _success = False
            if _resources and len(_resources) > 0:
                _success = True
                for _risorsa in _resources:
                    RisorsePiano(piano=_piano, risorsa=_risorsa).save()
            return UploadFile(piano_aggiornato=_piano, success=_success, file_name=_resources[0].nome)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #7
0
    def mutate(cls, root, info, **input):

        try:
            key = input['token']
            token: Token = Token.objects.get(key=key)
            delega: Delega = Delega.objects.get(token=token)
            piano = delega.delegante.piano

            if not auth.can_access_piano(info.context.user, piano):
                return GraphQLError(
                    "Forbidden - Utente non abilitato ad editare questo piano",
                    code=403)

            if not can_admin_delega(info.context.user, delega):
                return GraphQLError(
                    "Forbidden - Utente non abilitato ad editare questa delega",
                    code=403)

            delega.token.delete()
            delega.delete()

            return DeleteDelega(errors=[])

        except (Token.DoesNotExist, Delega.DoesNotExist) as e:
            return GraphQLError(e, code=404)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
    def mutate(cls, root, info, **input):
        _procedura_pubblicazione = ProceduraPubblicazione.objects.get(
            uuid=input['uuid'])
        _piano = _procedura_pubblicazione.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano,
                                         _procedura_pubblicazione,
                                         info.context.user)

            # Notify Users
            piano_phase_changed.send(sender=Piano,
                                     user=info.context.user,
                                     piano=_piano,
                                     message_type=TipoMail.pubblicazione_piano)

            return PubblicazionePiano(
                pubblicazione_aggiornata=_procedura_pubblicazione, errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
    def mutate(cls, root, info, **input):
        _procedura_approvazione = ProceduraApprovazione.objects.get(
            uuid=input['uuid'])
        _piano = _procedura_approvazione.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano,
                                   QualificaRichiesta.REGIONE):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano,
                                         _procedura_approvazione,
                                         info.context.user)

            check_and_promote(_piano, info)

            return AttribuzioneConformitaPIT(
                approvazione_aggiornata=_procedura_approvazione, errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #10
0
    def mutate(cls, root, info, **input):
        _procedura_avvio = ProceduraAvvio.objects.get(uuid=input['uuid'])
        _piano = _procedura_avvio.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_avvio,
                                         info.context.user)

            return AvvioPiano(avvio_aggiornato=_procedura_avvio, errors=[])

        except GraphQLError as e:
            return e

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #11
0
    def mutate(cls, root, info, **input):
        _procedura_adozione = ProceduraAdozione.objects.get(uuid=input['uuid'])
        _piano = _procedura_adozione.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        if not _procedura_adozione.pubblicazione_burt_url \
                or not _procedura_adozione.pubblicazione_burt_data \
                or not _procedura_adozione.pubblicazione_burt_bollettino \
                or not _procedura_adozione.pubblicazione_sito_url:
            return GraphQLError("Dati BURT non impostati", code=409)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano,
                                         _procedura_adozione,
                                         info.context.user)

            return PubblicazioneBurt(adozione_aggiornata=_procedura_adozione,
                                     errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #12
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.AC):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            if not _procedura_vas.risorse\
                    .filter(tipo=TipoRisorsa.PROVVEDIMENTO_VERIFICA_VAS.value, archiviata=False)\
                    .exists():
                return GraphQLError("File mancante: {}".format(
                    TipoRisorsa.PROVVEDIMENTO_VERIFICA_VAS.value),
                                    code=409)

            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info.context.user)

            return EmissioneProvvedimentoVerifica(
                vas_aggiornata=_procedura_vas, errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #13
0
    def mutate(cls, root, info, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Utente non autenticato", code=401)

        # Fetching input arguments
        _id = input['risorsa_id']
        _uuid_vas = input['codice']
        # TODO: Andrebbe controllato se la risorsa in funzione del tipo e della fase del piano è eliminabile o meno
        try:
            _procedura_vas = ProceduraVAS.objects.get(uuid=_uuid_vas)
            _piano = _procedura_vas.piano

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            _risorsa = Risorsa.objects.get(uuid=_id)

            if _risorsa.tipo == TipoRisorsa.PARERE_SCA.value:
                # if not auth_vas.parere_sca_ok(info.context.user, _procedura_vas):
                #     return GraphQLError("Risorsa non eliminabile", code=403)
                if is_executed(_piano.getFirstAction(TipologiaAzione.trasmissione_pareri_sca)):
                    return GraphQLError('Risorsa inviata e non modificabile', code=403)

            if _risorsa.tipo == TipoRisorsa.PARERE_VERIFICA_VAS and \
                    not auth_vas.parere_verifica_vas_ok(info.context.user, _procedura_vas):
                return GraphQLError("Risorsa non eliminabile", code=403)

            _success = DeleteRisorsaBase.handle_downloaded_data(_risorsa)
            return DeleteRisorsaVAS(procedura_vas_aggiornata=_procedura_vas, success=_success)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #14
0
    def mutate(cls, root, info, **input):
        _procedura_avvio = ProceduraAvvio.objects.get(uuid=input['uuid'])
        _piano = _procedura_avvio.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.GC):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        # check risorsa
        if not _piano.risorse\
                .filter(tipo=TipoRisorsa.DOCUMENTO_GENIO_CIVILE.value, archiviata=False, user=info.context.user)\
                .exists():
            return GraphQLError("Risorsa mancante: {}".format(
                TipoRisorsa.DOCUMENTO_GENIO_CIVILE.value),
                                code=409)

        try:
            closed = cls.update_actions_for_phase(_piano.fase, _piano,
                                                  _procedura_avvio,
                                                  info.context.user)

            if closed:
                check_and_promote(_piano, info)

            return InvioProtocolloGenioCivile(
                avvio_aggiornato=_procedura_avvio, errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #15
0
    def mutate(cls, root, info, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Utente non autenticato", code=401)

        # Fetching input arguments
        _id = input['risorsa_id']
        _uuid_cc = input['codice']
        # TODO: Andrebbe controllato se la risorsa in funzione del tipo e della fase del piano è eliminabile o meno
        try:
            _piano_rev_post_cp = PianoRevPostCP.objects.get(uuid=_uuid_cc)
            _piano = _piano_rev_post_cp.piano

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            _risorsa = Risorsa.objects.get(uuid=_id)
            _success = DeleteRisorsaBase.handle_downloaded_data(_risorsa)
            return DeleteRisorsaPianoRevPostCP(
                piano_rev_post_cp_aggiornato=_piano_rev_post_cp, success=_success)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #16
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraAdozioneVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano
        _procedura_adozione = ProceduraAdozione.objects.get(piano=_piano)

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        if not _procedura_adozione.pubblicazione_burt_data:
            return GraphQLError("Errore - burtdata mancante", code=500)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano,
                                         _procedura_adozione,
                                         info.context.user)
            check_and_promote(_piano, info)

            return UploadElaboratiAdozioneVAS(vas_aggiornata=_procedura_vas,
                                              errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #17
0
    def mutate(cls, root, info, file, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Not Authorized - Utente non riconosciuto", code=401)

        # Fetching input arguments
        _uuid_vas = input['codice']
        _tipo_file = input['tipo_file']

        try:
            # Validating 'Procedura VAS'
            _procedura_vas = ProceduraVAS.objects.get(uuid=_uuid_vas)
            _piano = _procedura_vas.piano

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            if _tipo_file == TipoRisorsa.PARERE_SCA.value:
                # if _procedura_vas.risorse.filter(tipo=_tipo_file, archiviata=False, user=info.context.user).exists():
                #     return GraphQLError('Precondition failed - Non si possono aggiungere ulteriori pareri SCA', code=412)

                if is_executed(_piano.getFirstAction(TipologiaAzione.trasmissione_pareri_sca)):
                    return GraphQLError('Risorsa inviata e non modificabile', code=403)

            if _tipo_file == TipoRisorsa.PARERE_VERIFICA_VAS.value and \
                    not auth_vas.parere_verifica_vas_ok(info.context.user, _procedura_vas):
                return GraphQLError('Precondition failed - Verifica VAS esistente', code=412)

            # not rules.test_rule('strt_core.api.parere_verifica_vas_ok', info.context.user, _procedura_vas):
            #     return GraphQLError(_("Forbidden"), code=403)

            _resources = UploadBaseBase.handle_uploaded_data(
                file,
                _uuid_vas,
                _procedura_vas.piano.fase,
                _tipo_file,
                info.context.user
            )
            _success = False
            if _resources and len(_resources) > 0:
                _success = True
                for _risorsa in _resources:
                    RisorseVas(procedura_vas=_procedura_vas, risorsa=_risorsa).save()
            return UploadRisorsaVAS(
                procedura_vas_aggiornata=_procedura_vas,
                success=_success,
                file_name=_resources[0].nome)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #18
0
    def mutate_and_get_payload(cls, root, info, **input):

        _procedura_adozione = ProceduraAdozione.objects.get(uuid=input['uuid'])
        _procedura_adozione_data = input.get('procedura_adozione')

        _piano = _procedura_adozione.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        for fixed_field in ['uuid', 'piano', 'data_creazione', 'ente']:
            if fixed_field in _procedura_adozione_data:
                logger.warning(
                    'Il campo "{}" non può essere modificato'.format(
                        fixed_field))
                _procedura_adozione_data.pop(fixed_field)

        try:
            procedura_adozione_aggiornata = update_create_instance(
                _procedura_adozione, _procedura_adozione_data)

            # todo: impedire aggiornamenti burt se pubblicazione_burt eseguita

            if procedura_adozione_aggiornata.data_delibera_adozione:
                _expire_days = getattr(
                    settings, 'ADOZIONE_RICEZIONE_PARERI_EXPIRE_DAYS', 30)
                _alert_delta = datetime.timedelta(days=_expire_days)
                procedura_adozione_aggiornata.data_ricezione_pareri = \
                    procedura_adozione_aggiornata.data_delibera_adozione + _alert_delta

            # todo: eliminare dal modello, la data viene calcolata su richiesta nel nodo di output
            if procedura_adozione_aggiornata.pubblicazione_burt_data:
                _expire_days = getattr(
                    settings, 'ADOZIONE_RICEZIONE_OSSERVAZIONI_EXPIRE_DAYS',
                    30)
                _alert_delta = datetime.timedelta(days=_expire_days)
                procedura_adozione_aggiornata.data_ricezione_osservazioni = \
                    procedura_adozione_aggiornata.pubblicazione_burt_data + _alert_delta

            procedura_adozione_aggiornata.save()
            return cls(
                procedura_adozione_aggiornata=procedura_adozione_aggiornata)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #19
0
    def mutate(cls, root, info, file, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Not Authorized - Utente non riconosciuto", code=401)

        # Fetching input arguments
        _uuid_adozione = input['codice']
        _tipo_file = input['tipo_file']

        try:
            _procedura_adozione = ProceduraAdozione.objects.get(uuid=_uuid_adozione)
            _piano = _procedura_adozione.piano

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            require_action(_piano, _tipo_file,
                           TipoRisorsa.OSSERVAZIONI_ENTI, TipologiaAzione.osservazioni_enti)
            require_action(_piano, _tipo_file,
                           TipoRisorsa.OSSERVAZIONI_PRIVATI, TipologiaAzione.upload_osservazioni_privati)

            _resources = UploadBaseBase.handle_uploaded_data(
                file,
                _uuid_adozione,
                _procedura_adozione.piano.fase,
                _tipo_file,
                info.context.user
            )
            _success = False
            if _resources and len(_resources) > 0:
                _success = True
                for _risorsa in _resources:
                    RisorseAdozione(procedura_adozione=_procedura_adozione, risorsa=_risorsa).save()
            return UploadRisorsaAdozione(
                procedura_adozione_aggiornata=_procedura_adozione,
                success=_success,
                file_name=_resources[0].nome)

        except GraphQLError as ge:
            return ge

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #20
0
    def mutate_and_get_payload(cls, root, info, **input):

        _procedura_avvio = ProceduraAvvio.objects.get(uuid=input['uuid'])
        _procedura_avvio_data = input.get('procedura_avvio')

        _piano = _procedura_avvio.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        for fixed_field in ['uuid', 'piano', 'data_creazione', 'ente']:
            if fixed_field in _procedura_avvio_data:
                logger.warning(
                    'Il campo "{}" non può essere modificato'.format(
                        fixed_field))
                _procedura_avvio_data.pop(fixed_field)

        try:
            # Tipologia (O)
            if 'conferenza_copianificazione' in _procedura_avvio_data:
                if not auth.has_qualifica(info.context.user, _piano.ente,
                                          Qualifica.OPCOM):
                    return GraphQLError(
                        "Forbidden - Richiesta qualifica Responsabile",
                        code=403)

                _conferenza_copianificazione = TipologiaCopianificazione.fix_enum(
                    _procedura_avvio_data.pop('conferenza_copianificazione'),
                    none_on_error=True)

                if _conferenza_copianificazione:
                    _procedura_avvio_data[
                        'conferenza_copianificazione'] = _conferenza_copianificazione

            procedura_avvio_aggiornata = update_create_instance(
                _procedura_avvio, _procedura_avvio_data)

            return cls(procedura_avvio_aggiornata=procedura_avvio_aggiornata)
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #21
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraAdozioneVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano
        _procedura_adozione = ProceduraAdozione.objects.get(piano=_piano)

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.AC):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        if not _procedura_adozione.pubblicazione_burt_data:
            return GraphQLError("Errore - burtdata mancante", code=500)

        try:
            # _tutti_pareri_inviati = True
            # for _sca in _piano.soggetti_sca.all():
            #     _pareri_vas_count = ParereAdozioneVAS.objects.filter(
            #         user=_sca.user,
            #         procedura_adozione=_procedura_adozione
            #     ).count()
            #
            #     if _pareri_vas_count == 0:
            #         _tutti_pareri_inviati = False
            #         break
            #
            # if _tutti_pareri_inviati:
            cls.update_actions_for_phase(_piano.fase, _piano,
                                         _procedura_adozione,
                                         info.context.user)

            return InvioParereMotivatoAC(vas_aggiornata=_procedura_vas,
                                         errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #22
0
    def mutate(cls, root, info, file, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Forbidden - Utente non riconosciuto", code=403)

        # Fetching input arguments
        _uuid_cc = input['codice']
        _tipo_file = input['tipo_file']

        try:
            _conferenza_copianificazione = ConferenzaCopianificazione.objects.get(uuid=_uuid_cc)
            _piano = _conferenza_copianificazione.piano

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            _resources = UploadBaseBase.handle_uploaded_data(
                file,
                _uuid_cc,
                _conferenza_copianificazione.piano.fase,
                _tipo_file,
                info.context.user
            )
            _success = False
            if _resources and len(_resources) > 0:
                _success = True
                for _risorsa in _resources:
                    RisorseCopianificazione(
                        conferenza_copianificazione=_conferenza_copianificazione,
                        risorsa=_risorsa).save()
            return UploadRisorsaCopianificazione(
                conferenza_copianificazione_aggiornata=_conferenza_copianificazione,
                success=_success,
                file_name=_resources[0].nome)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #23
0
    def mutate(cls, root, info, **input):
        _procedura_vas = ProceduraVAS.objects.get(uuid=input['uuid'])
        _piano = _procedura_vas.piano

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            errs = []

            for tipo in [
                    TipoRisorsa.RAPPORTO_AMBIENTALE,
                    TipoRisorsa.SINTESI_NON_TECNICA
            ]:
                if not _procedura_vas.risorse\
                        .filter(tipo=tipo.value, archiviata=False, user=info.context.user)\
                        .exists():
                    return GraphQLError("File mancante: {}".format(tipo.value),
                                        code=409)

            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info.context.user)

            if try_and_close_avvio(_piano):
                check_and_promote(_piano, info)  # check for auto promotion

            return RedazioneDocumentiVAS(vas_aggiornata=_procedura_vas,
                                         errors=errs)
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #24
0
    def mutate(cls, root, info, **input):
        _piano = Piano.objects.get(codice=input['codice_piano'])

        # Primo chek generico di autorizzazione
        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        try:
            promoted, errors = check_and_promote(_piano, info)

            if promoted:
                return PromozionePiano(piano_aggiornato=_piano, errors=[])
            else:
                return GraphQLError("Dati non corretti",
                                    code=409,
                                    errors=errors)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #25
0
    def mutate(cls, root, info, file, **input):

        if not auth.is_recognizable(info.context.user):
            return GraphQLError("Not Authorized - Utente non riconosciuto", code=401)

        # Fetching input arguments
        _uuid_vas = input['codice']
        _tipo_file = input['tipo_file']

        try:
            _procedura_vas = ProceduraAdozioneVAS.objects.get(uuid=_uuid_vas)
            _piano = _procedura_vas.piano

            if not auth.can_access_piano(info.context.user, _piano):
                return GraphQLError("Forbidden - Utente non abilitato ad editare questo piano", code=403)

            _resources = UploadBaseBase.handle_uploaded_data(
                file,
                _uuid_vas,
                _procedura_vas.piano.fase,
                _tipo_file,
                info.context.user
            )
            _success = False
            if _resources and len(_resources) > 0:
                _success = True
                for _risorsa in _resources:
                    RisorseAdozioneVas(procedura_adozione_vas=_procedura_vas, risorsa=_risorsa).save()
            return UploadRisorsaAdozioneVAS(
                procedura_vas_aggiornata=_procedura_vas,
                success=_success,
                file_name=_resources[0].nome)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #26
0
    def mutate(cls, root, info, **input):
        _piano = Piano.objects.get(codice=input['codice_piano'])
        _procedura_vas = ProceduraVAS.objects.get(piano=_piano)

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano, Qualifica.OPCOM):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            cls.update_actions_for_phase(_piano.fase, _piano, _procedura_vas,
                                         info.context.user)

            check_and_promote(_piano, info)

            return FormazionePiano(piano_aggiornato=_piano, errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
    def __call__(self, request):
        # Code to be executed for each request before the view (and later middleware) are called.

        def create_redirect_piano(request, piano):
            return HttpResponseRedirect(
                '{request_path}/#/piano/{piano}/home'.format(
                    request_path=request.path, piano=piano.codice))

        # Read token either from param or from header
        token = request.GET.get('token', None)
        if token is None:
            auth_header = request.META.get('HTTP_AUTHORIZATION', b'').split()
            if auth_header and auth_header[0].lower() == b'token':
                # If they specified an invalid token, let them know.
                if len(auth_header) != 2:
                    return HttpResponseBadRequest("Improperly formatted token")
                token = auth_header[1]

        if token:

            if not is_recognizable(request.user):
                logger.debug("Token specificato su utente sconosciuto")

                redirected = request.GET.get('redirected_by', None)
                if not redirected == 'TokenMiddleware':  # did we just redirect this
                    return HttpResponseRedirect(
                        '{login_path}?next={request_path}%3Ftoken={token}&redirected_by=TokenMiddleware'
                        .format(login_path=getattr(settings, 'LOGIN_URL', '/'),
                                request_path=request.path,
                                token=token))
            else:
                logger.debug(
                    "Token e utente specificati. Token [{}]".format(token))

                t: Token = Token.objects.filter(key=token).first()
                if t:
                    if not t.is_expired():
                        utente = request.user
                        d: Delega = Delega.objects.get(token=t)
                        piano = d.delegante.piano

                        if t.user is None:
                            ok, err = assegna_token(d, utente)
                            return create_redirect_piano(request, piano)

                        elif t.user == utente:
                            logger.info("Token già in uso [{}]".format(token))
                            return create_redirect_piano(request, piano)

                        else:
                            logger.warning(
                                "Token già assegnato ad altro utente [{}]".
                                format(token))

                            # se l'utente ha cmq accesso al piano, usiamo il token come semplice bookmark
                            if can_access_piano(utente, piano):
                                return create_redirect_piano(request, piano)
                    else:
                        logger.warning("Token expired [{}]".format(token))
                else:
                    logger.warning("Token non trovato [{}]".format(token))

        # ------------------------
        # calls the view
        response = self.get_response(request)
        # ------------------------

        # Code to be executed for each request/response after the view is called.

        return response
Пример #28
0
    def mutate(cls, root, info, **input):
        _procedura_ad_vas: ProceduraAdozioneVAS = ProceduraAdozioneVAS.objects.get(
            uuid=input['uuid'])
        _piano: Piano = _procedura_ad_vas.piano
        _procedura_adozione: ProceduraAdozione = ProceduraAdozione.objects.get(
            piano=_piano)

        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        if not auth.can_edit_piano(info.context.user, _piano,
                                   QualificaRichiesta.SCA):
            return GraphQLError(
                "Forbidden - Utente non abilitato per questa azione", code=403)

        try:
            # controlla se l'utente ha caricato il suo file parere
            _esiste_risorsa = _procedura_ad_vas.risorse\
                    .filter(tipo=TipoRisorsa.PARERE_ADOZIONE_SCA.value, archiviata=False, user=info.context.user)\
                    .exists()
            if not _esiste_risorsa:
                logger.warning("RISORSA NON TROVATA per utente {}".format(
                    info.context.user))
                for r in _procedura_ad_vas.risorse.filter(archiviata=False):
                    logger.warning('Risorsa {tipo} per utente {u}'.format(
                        tipo=r.tipo, u=r.user))
                for r in RisorseAdozioneVas.objects.all():
                    logger.warning(
                        'RisorseAdozioneVas {tipo} per utente {u}'.format(
                            tipo=r.risorsa.tipo, u=r.risorsa.user))

                return GraphQLError("File relativo al pareri SCA mancante",
                                    code=409)

            # controlla se l'utente ha già validato il parere
            _esiste_parere_ad_vas = ParereAdozioneVAS.objects\
                .filter(user=info.context.user, procedura_adozione=_procedura_adozione)\
                .exists()
            if _esiste_parere_ad_vas:
                return GraphQLError("Parere SCA esistente per questo utente")

            # ok, salva parere
            _parere_vas = ParereAdozioneVAS(
                inviata=True,
                user=info.context.user,
                procedura_adozione=_procedura_adozione)
            _parere_vas.save()

            # controlla se l'azione può essere chiusa
            _tutti_pareri_inviati = True
            for _so_sca in SoggettoOperante.get_by_qualifica(
                    _piano, Qualifica.SCA):
                ass = Assegnatario.objects.filter(
                    qualifica_ufficio=_so_sca.qualifica_ufficio)
                # todo aggiungi token
                utenti_sca = [a.utente for a in ass]
                _parere_sent = ParereAdozioneVAS.objects\
                    .filter(
                        procedura_adozione=_procedura_adozione,
                        user__in=utenti_sca)\
                    .exists()

                if not _parere_sent:
                    deleghe = Delega.objects.filter(delegante=_so_sca)
                    users = [d.token.user for d in deleghe]
                    _parere_sent = ParereAdozioneVAS.objects.filter(
                        procedura_adozione=_procedura_adozione,
                        user__in=users,
                    ).exists()

                if not _parere_sent:
                    _tutti_pareri_inviati = False
                    break

            if _tutti_pareri_inviati:
                cls.update_actions_for_phase(_piano.fase, _piano,
                                             _procedura_adozione,
                                             info.context.user)

            return InvioPareriAdozioneVAS(vas_aggiornata=_procedura_ad_vas,
                                          errors=[])
        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #29
0
    def mutate_and_get_payload(cls, root, info, **input):
        _piano = Piano.objects.get(codice=input['codice'])
        _piano_input = input.get('piano_operativo')
        _ente = _piano.ente

        if not info.context.user:
            return GraphQLError("Unauthorized", code=401)

        # Primo chek generico di autorizzazione
        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        try:

            for fixed_field in [
                    'codice', 'data_creazione', 'data_accettazione',
                    'data_avvio', 'data_approvazione', 'ente', 'fase',
                    'tipologia', 'data_protocollo_genio_civile', 'responsabile'
            ]:
                if fixed_field in _piano_input:
                    logger.warning(
                        'Il campo "{}" non può essere modificato attraverso questa operazione'
                        .format(fixed_field))
                    _piano_input.pop(fixed_field)

                # TODO: check what to do with 'data_delibera'

            # ############################################################ #
            # Editable fields - consistency checks
            # ############################################################ #
            # Descrizione (O)
            if 'descrizione' in _piano_input:
                _data = _piano_input.pop('descrizione')
                # if rules.test_rule('strt_core.api.can_update_piano', info.context.user, _piano):
                _piano.descrizione = _data[0]

            # Data Delibera (O)
            # if 'data_delibera' in _piano_input:
            #     if not rules.test_rule('strt_core.api.can_update_piano', info.context.user, _piano):
            #         _piano_input.pop('data_delibera')
            # This cannot be changed

            # Soggetto Proponente (O)
            if 'soggetto_proponente_uuid' in _piano_input:

                if not auth.can_edit_piano(info.context.user, _piano,
                                           Qualifica.OPCOM):
                    return GraphQLError(
                        "Forbidden - Utente non abilitato per questa azione",
                        code=403)

                _soggetto_proponente_uuid = _piano_input.pop(
                    'soggetto_proponente_uuid')
                if _soggetto_proponente_uuid:
                    ufficio = Ufficio.objects.filter(
                        uuid=_soggetto_proponente_uuid).get()
                    if not ufficio:
                        return GraphQLError(
                            _("Not found - Ufficio proponente sconosciuto"),
                            code=404)

                    qu = QualificaUfficio.objects.filter(
                        ufficio=ufficio, qualifica=Qualifica.OPCOM).get()
                    if not qu:
                        return GraphQLError(_(
                            "Not found - L'ufficio proponente non è responsabile di Comune"
                        ),
                                            code=404)

                    _piano.soggetto_proponente = qu

                else:
                    _piano.soggetto_proponente = None

            if 'soggetti_operanti' in _piano_input:

                # if not auth.is_soggetto(info.context.user, _piano):
                #     return GraphQLError(_("Forbidden - L'utente non è soggetto"), code=403)

                _soggetti_operanti = _piano_input.pop(
                    'soggetti_operanti')  # potrebbe essere vuoto

                old_so_qs = SoggettoOperante.objects.filter(piano=_piano)
                old_so_dict = {
                    so.qualifica_ufficio.ufficio.uuid.__str__() + "_" +
                    so.qualifica_ufficio.qualifica.name: so
                    for so in old_so_qs
                }
                add_so = []

                for _so in _soggetti_operanti:
                    uff = Ufficio.objects.filter(uuid=_so.ufficio_uuid).get()
                    qualifica = Qualifica.fix_enum(
                        _so.qualifica, none_on_error=True)  # TODO: 404
                    hash = _so.ufficio_uuid + "_" + qualifica.name
                    if hash in old_so_dict:
                        del old_so_dict[hash]
                    else:
                        qu = QualificaUfficio.objects \
                            .filter(ufficio=uff, qualifica=qualifica).get()
                        new_so = SoggettoOperante(qualifica_ufficio=qu,
                                                  piano=_piano)
                        add_so.append(new_so)

                # pre-check
                # - OPCOM può modificare SO con qualunque qualifica
                # - AC può modificare SO con qualifica SCA
                for so in list(old_so_dict.values()) + add_so:
                    if not auth.has_qualifica(info.context.user, _ente,
                                              Qualifica.OPCOM):
                        if so.qualifica_ufficio.qualifica == Qualifica.SCA:
                            if not auth.has_qualifica(info.context.user, _ente,
                                                      Qualifica.AC):
                                return GraphQLError(
                                    "Utente non abilitato alla modifica di questo SoggettoOperante",
                                    code=403)

                # remove all SO left in the old_so_dict since they are not in the input list
                for so in old_so_dict.values():
                    for d in Delega.objects.filter(delegante=so):
                        d.token.delete()
                        d.delete()
                    so.delete()

                # create new SO
                for so in add_so:
                    so.save()

            piano_aggiornato = update_create_instance(_piano, _piano_input)
            return cls(piano_aggiornato=piano_aggiornato)

        except (Ufficio.DoesNotExist, QualificaUfficio.DoesNotExist) as e:
            return GraphQLError(e, code=404)

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)
Пример #30
0
    def mutate(cls, root, info, **input):
        def _get_or_create_resp_so():
            so = auth.get_so(info.context.user, _piano,
                             Qualifica.OPCOM).first()

            if not so:
                # l'utente non ha SO direttamente associato, quindi lo creiamo
                ass = get_assegnamenti(info.context.user, _piano.ente,
                                       Qualifica.OPCOM).first()
                so = SoggettoOperante(piano=_piano,
                                      qualifica_ufficio=ass.qualifica_ufficio)
                so.save()
            return so

        _piano = Piano.objects.get(codice=input['codice_piano'])

        # Primo check generico di autorizzazione
        if not auth.can_access_piano(info.context.user, _piano):
            return GraphQLError(
                "Forbidden - Utente non abilitato ad editare questo piano",
                code=403)

        try:
            qualifica = Qualifica.fix_enum(input['qualifica'],
                                           none_on_error=True)
            is_resp = auth.has_qualifica(info.context.user, _piano.ente,
                                         Qualifica.OPCOM)

            if not qualifica:
                return GraphQLError("Qualifica sconosciuta", code=404)

            elif qualifica == Qualifica.OPCOM:
                return GraphQLError("Qualifica non delegabile", code=400)

            elif qualifica == Qualifica.READONLY:
                # associa alla delega un qualiasi SO associato all'utente
                so = auth.get_so(info.context.user, _piano).first()
                if not so:
                    if is_resp:
                        # l'utente è RESP per l'ente, ma non ha SO direttamente associato, quindi lo creiamo
                        so = _get_or_create_resp_so()
                    else:
                        return GraphQLError(
                            "Forbidden - Utente non assegnatario", code=403)
            else:
                #
                so = auth.get_so(info.context.user, _piano, qualifica).first()
                if not so:
                    if is_resp:
                        # l'utente è RESP per l'ente, ma non ha SO direttamente associato, quindi lo creiamo
                        so = _get_or_create_resp_so()
                    else:
                        return GraphQLError(
                            "Forbidden - Qualifica non assegnabile", code=403)

            token = Token()
            token.key = Token.generate_key()
            token.expires = datetime.datetime.now() + datetime.timedelta(
                days=30)  # TODO
            token.save()

            delega = Delega()
            delega.qualifica = qualifica
            delega.delegante = so
            delega.created_by = info.context.user
            delega.token = token
            delega.save()

            # TODO: USE EMAIL
            # piano_phase_changed.send(
            #     sender=Piano,
            #     user=info.context.user,
            #     piano=_piano,
            #     message_type="delega")

            return CreaDelega(token=token.key, errors=[])

        except BaseException as e:
            tb = traceback.format_exc()
            logger.error(tb)
            return GraphQLError(e, code=500)