def deleteDocument(self, input):
        """
        cancellazione di un file
        input:
            input: dict
        output:
            ritorna una tupla composta da:
                int: numero di oggetti eliminati
                dict: che indica il numero di cancellazioni per quel tipo
                      di oggetto
            esempio:
                (1, {'document.Entry': 1})
        """
        try:
            documentobj = extract_value_from_input(input=input,
                                                   field_id='document_id',
                                                   model_type='Document',
                                                   model=document_model)
        except ObjectDoesNotExist:
            raise GraphQLError(
                u'Ci sono stati problemi durante il recupero del documento.')

        try:
            # Qui c'è l'effettiva eliminazione del file dal DISCO (non dal DB).
            documentobj.document.delete()
        except Exception:
            raise GraphQLError(
                u'Problemi durante la cancellazione del documento.')

        return documentobj.delete()
    def getWspById(self, input):
        wsp = extract_value_from_input(input=input,
                                       field_id='id',
                                       model_type='Wsp',
                                       model=wsp_model)

        return wsp
Beispiel #3
0
    def __init__(self, struct_type, startDate, endDate, struct_id):
        # recupero la lista di strutture di un certo tipo
        self.struct_type = struct_type
        self.structList = []
        structureService = StructureService()

        # La precedenza viene data a struct_id: se lui è specificato, allora
        # restituisco il singolo elemento con quell'id.
        if struct_type and not struct_id:
            self.structList = structureService.getStructureByType(
                struct_type=struct_type)
        elif struct_id:
            self.structList.append(
                extract_value_from_input(
                    input={'struct_id': struct_id},
                    field_id='struct_id',
                    model_type='Structure',
                    model=structure_models,
                ))
        else:
            self.structList = structureService.getStructureByType()

        # recupero i samplerange in un certo intervallo
        self.sampleRangeList = []
        if startDate and endDate:
            sampleRangeService = SampleRangeService()
            self.sampleRangeList = sampleRangeService.getSampleRangeByStartDateAndEndDateAndFilter(
                startDate=startDate, endDate=endDate, filter_on=False)
Beispiel #4
0
    def updateSetting(self, input):
        try:
            settingobj = extract_value_from_input(
                input,
                'setting_id',
                'Settings',
                settings_model)
        except ObjectDoesNotExist:
            raise GraphQLError(
                u'Problemi durante il recupero di alcune impostazioni.'
            )

        if input.get('setting_id', None):
            if input.get('setting_type', None):
                settingobj.setting_type = input.get('setting_type')
            if input.get('value', None):
                settingobj.value = input.get('value')
            if input.get('description', None):
                settingobj.description = input.get('description')
            if input.get('notes_actions_json', None):
                settingobj.notes_actions_json = ast.literal_eval(
                    input.get('notes_actions_json'))
            # caso in cui venga aggiornata la posizione
            if isinstance(input.get('position'), int):
                settingService = SettingService()
                settingobj.position = settingService.updatePosition(
                    old_position=settingobj.position,
                    new_position=input.get('position'),
                    setting_type=settingobj.setting_type
                )

            settingobj.save()
            return settingobj
Beispiel #5
0
    def deleteSampleRange(self, input):
        try:
            samranobj = extract_value_from_input(input, 'samplerange_id',
                                                 'SampleRange',
                                                 samplerange_model)
        except ObjectDoesNotExist as err:
            raise GraphQLError(u'Problemi durante il recupero di un ' +
                               u'intervallo di campionamento.')

        if samranobj.manager_block or \
            samranobj.tecnico_block or \
                samranobj.final_block:
            raise GraphQLError(
                u'Non puoi cancellare un intervallo di campionamento ' +
                u'che è stato bloccato o parzialmente bloccato.')

        return samranobj.delete()
    def uploadFile(self, data, input):
        """
        upload di un nuovo file
        input:
            data: i file passati nella request
            input: dict
        output:
            -
        """
        settingService = SettingService()

        try:
            samranobj = extract_value_from_input(input, 'samplerange_id',
                                                 'SampleRange',
                                                 samplerange_model)
        except ObjectDoesNotExist:
            raise GraphQLError(u'Problemi durante il recupero ' +
                               u'dell\'intervallo di campionamento.')

        doc = document_model(document=data,
                             description=input.get('file_description', ''),
                             samplerange=samranobj)

        # recupero il setting della grandezza massima del file consentita
        settingList = settingService.getSettingBySettingType(
            setting_type='max_upload_size')
        sizelimit = settingList[0] if settingList else None

        # Facciamo qui i controlli del caso
        if doc.document.size > sizelimit.int_value:
            raise GraphQLError(u"File troppo grande. Dimensione massima "
                               u"consentita: {}. "
                               u"Il file invece è {}".format(
                                   humanbytes(sizelimit.int_value),
                                   humanbytes(doc.document.size)))

        filename, file_extension = os.path.splitext(doc.document.name)
        allowedext = settingService.getSettingBySettingType(
            setting_type='allowed_file_ext')

        if file_extension not in [ext.value for ext in allowedext]:
            raise GraphQLError(
                u"Estensione file non ammessa: {}".format(file_extension))

        doc.save()
    def deleteReport(self, input):
        try:
            reportobj = extract_value_from_input(
                input=input,
                field_id='report_id',
                model_type='Report',
                model=report_model
            )
        except ObjectDoesNotExist:
            raise GraphQLError(
                u'Problemi con il recupero di un rapporto di campionamento.'
            )

        if reportobj.sample_range.manager_block or \
            reportobj.sample_range.tecnico_block or \
                reportobj.sample_range.final_block:
            raise GraphQLError(u"Non si può cancellare un rapporto se il suo "
                               u"intervallo ha almeno una validazione!")

        return reportobj.delete()
Beispiel #8
0
    def deleteSetting(self, input):
        settingService = SettingService()

        try:
            settingobj = extract_value_from_input(
                input,
                'setting_id',
                'Settings',
                settings_model)
        except ObjectDoesNotExist:
            raise GraphQLError(
                u'Problemi durante il recupero di alcune impostazioni.'
            )

        settings_list = settingService.getSettingBySettingType('risk_level')
        new_position = settings_list.reverse()[0].position
        settingService.updatePosition(
            old_position=settingobj.position,
            new_position=new_position,
            setting_type=settingobj.setting_type
        )

        return settingobj.delete()
    def updateReport(self, input, user_groups):
        # service
        reportService = ReportService()
        settingService = SettingService()
        rangeService = RangeService()

        # CAMPI CON ID
        fields = [
            ('report_id', 'Report', report_model),
            ('wsp', 'Wsp', wsp_model),
            ('sample_range', 'SampleRange', samplerange_model),
            ('cold_ufcl_type', 'Settings', settings_model),
            ('cold_flow_ufcl_type', 'Settings', settings_model),
            ('cold_ufcl_sampling_selection', 'Settings', settings_model),
            ('cold_flow_ufcl_sampling_selection', 'Settings', settings_model),
            ('hot_ufcl_type', 'Settings', settings_model),
            ('hot_flow_ufcl_type', 'Settings', settings_model),
            ('hot_ufcl_sampling_selection', 'Settings', settings_model),
            ('hot_flow_ufcl_sampling_selection', 'Settings', settings_model)
        ]

        fields_with_ids = {}
        try:
            fields_with_ids = {x[0]: extract_value_from_input(
                input=input,
                field_id=x[0],
                model_type=x[1],
                model=x[2]) for x in fields}
        except ObjectDoesNotExist as err:
            raise GraphQLError(
                u'Problemi durante il recupero di alcuni dati.'
            )

        # CONTROLLI LOGICA BLOCCHI
        # user_group = info.context.user.groups.all()
        sample_range = fields_with_ids.get('sample_range')
        if sample_range:
            if sample_range.final_block:
                raise GraphQLError('Il report è già congelato.')
        else:
            raise GraphQLError('Manca l\'intervallo di campionamento.')

        # controllo che il wsp del report sia uguale a quello passato per
        # l'aggiornamento
        if fields_with_ids.get('wsp') != fields_with_ids.get('report_id').wsp:
            # se non è uguale allora controllo che quello nuovo non abbia già
            # un report in questo wsp
            # controllo se già presente un report per un wsp nel samplerange
            param = {}
            param['sample_range'] = fields_with_ids.get('sample_range')
            param['wsp'] = fields_with_ids.get('wsp')

            if reportService.getReportListByDict(param):
                return GraphQLError(
                    u'Questo WSP ha già un report assegnato in questo ' +
                    u'intervallo di campionamento.'
                )

        # controllo se è stato messo un blocco parziale, nel caso in cui sia
        # stato messo allora non deve essere possibile modificare i campi block
        # recupero i campi manager_block e tecnico_block
        param = {}
        param['setting_type'] = "field_permission"
        param['value__contains'] = 'Report.'
        param['owner__in'] = user_groups

        fields_with_permission = settingService.getSettingListByDict(param)

        # Nota: Manager può modificare il campo delle Note/Azioni anche se
        # sono stati applicati entrambi i blocchi
        if sample_range.manager_block:
            # controllo che all'interno dell'input ci siano campi bloccati
            for field in fields_with_permission:
                field_name = field.value.split('Report.', 1)[1]
                if field_name in input \
                   and field.owner.name != 'tecnico' \
                   and field_name != u'notes_actions' \
                   and sample_range.tecnico_block:
                    logger.error(
                        u"Tentata modifica campo {} con "
                        u"lock attivi sul sample range ID: {}".format(
                            humanize_string(field.value),
                            sample_range.id))
                    raise GraphQLError(
                        u"Non è possibile modificare il rapporto di "
                        u"campionamento perchè è già stato validato.")
        if sample_range.tecnico_block:
            # controllo che all'interno dell'input ci siano campi bloccati
            for field in fields_with_permission:
                if field.value.split('Report.', 1)[1] in input \
                   and field.owner.name != 'manager' \
                   and sample_range.manager_block:
                    logger.error(
                        u"Tentata modifica campo {} con "
                        u"lock attivi sul sample range ID: {}".format(
                            field.value,
                            sample_range.id))
                    raise GraphQLError(
                        u"Non è possibile modificare il rapporto di "
                        u"campionamento perchè è già stato validato.")

        # RANGE SETTINGS - info dal WSP e dal tipo di struttura associata.
        # La logica è: i range che sono per il tipo di struttura specificato
        # nei settings e che sono attivi.
        rangesettings = None
        if fields_with_ids.get('wsp'):
            wsp = fields_with_ids.get('wsp')
            wspstruct = wsp.structure.struct_type.value

            # controllo che il report vada ad inserire solo
            # i valori permessi dal wsp
            try:
                self._samevalue_report_wsp(wsp, input)
            except Exception as err:
                raise GraphQLError(
                    u'Questo report non accetta prelievi per il campo {0} '
                    u'perchè il WSP a lui associato non accetta prelievi per '
                    u'questo tipo di misurazioni {1}.'.format(
                        humanize_string(err.args[1]),
                        humanize_string(err.args[0])),
                )

            param = {}
            param['range_type__setting_type'] = 'struct_type'
            param['range_type__value'] = wspstruct
            param['flag'] = True

            rangeobj = rangeService.getRangeListByDict(param)
            if not rangeobj:
                raise GraphQLError(
                    u"Non c'è un range corretto utilizzabile per questo "
                    u"tipo di struttura: {}".format(wspstruct))
            elif len(rangeobj) > 1:
                raise GraphQLError(
                    u"Ci sono troppi range attivi per questo tipo di "
                    u"struttura! {} ."
                    u"Correggi disattivando i vecchi range.".format(
                        wspstruct))

            rangesettings = rangeobj[0]
        else:
            # non ci puo essere un report senza wsp associato
            pass

        sampling_date = None
        if 'sampling_date' in input.keys():
            sampling_date = datetime.datetime.strptime(
                input['sampling_date'],
                "%Y-%m-%d").date()

        review_date = None

        if 'review_date' in input.keys() and input['review_date']:
            review_date = datetime.datetime.strptime(
                input['review_date'],
                "%Y-%m-%d").date()

        # VALORI DI LEGIONELLA
        cold_ufcl = None
        if fields_with_ids.get('cold_ufcl_sampling_selection'):
            if fields_with_ids.get('cold_ufcl_sampling_selection').has_legionella_type:  # noqa
                cold_ufcl = input.get('cold_ufcl', 0)
            else:
                cold_ufcl = fields_with_ids.get(
                    'cold_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=cold_ufcl,
                value_name='cold_ufcl',
            )
        cold_flow_ufcl = None
        if fields_with_ids.get('cold_flow_ufcl_sampling_selection'):
            if fields_with_ids.get('cold_flow_ufcl_sampling_selection').has_legionella_type:  # noqa
                cold_flow_ufcl = input.get('cold_flow_ufcl', 0)
            else:
                cold_flow_ufcl = fields_with_ids.get(
                    'cold_flow_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=cold_flow_ufcl,
                value_name='cold_flow_ufcl',
            )
        hot_ufcl = None
        if fields_with_ids.get('hot_ufcl_sampling_selection'):
            if fields_with_ids.get('hot_ufcl_sampling_selection').has_legionella_type:  # noqa
                hot_ufcl = input.get('hot_ufcl', 0)
            else:
                hot_ufcl = fields_with_ids.get(
                    'hot_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=hot_ufcl,
                value_name='hot_ufcl',
            )
        hot_flow_ufcl = None
        if fields_with_ids.get('hot_flow_ufcl_sampling_selection'):
            if fields_with_ids.get('hot_flow_ufcl_sampling_selection').has_legionella_type:  # noqa
                hot_flow_ufcl = input.get('hot_flow_ufcl', 0)
            else:
                hot_flow_ufcl = fields_with_ids.get(
                    'hot_flow_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=hot_flow_ufcl,
                value_name='hot_flow_ufcl',
            )

        # VALORI DI BIOSSIDO
        cold_chlorine_dioxide = None
        if 'cold_chlorine_dioxide' in input.keys():
            cold_chlorine_dioxide = input['cold_chlorine_dioxide']
            if cold_chlorine_dioxide:
                self._validateReportValue(
                    setting=rangesettings.chlorine_dioxide,
                    value=cold_chlorine_dioxide,
                    value_name='cold_chlorine_dioxide',
                )
        cold_flow_chlorine_dioxide = None
        if 'cold_flow_chlorine_dioxide' in input.keys():
            cold_flow_chlorine_dioxide = input['cold_flow_chlorine_dioxide']
            if cold_flow_chlorine_dioxide:
                self._validateReportValue(
                    setting=rangesettings.chlorine_dioxide,
                    value=cold_flow_chlorine_dioxide,
                    value_name='cold_flow_chlorine_dioxide',
                )
        hot_chlorine_dioxide = None
        if 'hot_chlorine_dioxide' in input.keys():
            hot_chlorine_dioxide = input['hot_chlorine_dioxide']
            if hot_chlorine_dioxide:
                self._validateReportValue(
                    setting=rangesettings.chlorine_dioxide,
                    value=hot_chlorine_dioxide,
                    value_name='hot_chlorine_dioxide',
                )
        hot_flow_chlorine_dioxide = None
        if 'hot_flow_chlorine_dioxide' in input.keys():
            hot_flow_chlorine_dioxide = input['hot_flow_chlorine_dioxide']
            if hot_flow_chlorine_dioxide:
                self._validateReportValue(
                    setting=rangesettings.chlorine_dioxide,
                    value=hot_flow_chlorine_dioxide,
                    value_name='hot_flow_chlorine_dioxide',
                )

        # VALORI DI TEMPERATURA
        cold_temperature = None
        if 'cold_temperature' in input.keys():
            cold_temperature = input['cold_temperature']
            if cold_temperature:
                self._validateReportValue(
                    setting=rangesettings.cold_temperature,
                    value=cold_temperature,
                    value_name='cold_temperature',
                )
        cold_flow_temperature = None
        if 'cold_flow_temperature' in input.keys():
            cold_flow_temperature = input['cold_flow_temperature']
            if cold_flow_temperature:
                self._validateReportValue(
                    setting=rangesettings.cold_flow_temperature,
                    value=cold_flow_temperature,
                    value_name='cold_flow_temperature',
                )
        hot_temperature = None
        if 'hot_temperature' in input.keys():
            hot_temperature = input['hot_temperature']
            if hot_temperature:
                self._validateReportValue(
                    setting=rangesettings.hot_temperature,
                    value=hot_temperature,
                    value_name='hot_temperature',
                )
        hot_flow_temperature = None
        if 'hot_flow_temperature' in input.keys():
            hot_flow_temperature = input['hot_flow_temperature']
            if hot_flow_temperature:
                self._validateReportValue(
                    setting=rangesettings.hot_flow_temperature,
                    value=hot_flow_temperature,
                    value_name='hot_flow_temperature',
                )

        if fields_with_ids.get('report_id'):

            report = fields_with_ids.get('report_id')

            if sample_range:
                report.sample_range = sample_range
            if fields_with_ids.get('wsp'):
                report.wsp = fields_with_ids.get('wsp')
                report.risk_level = fields_with_ids.get('wsp').risk_level
            report.rangesettings = rangesettings
            if sampling_date:
                report.sampling_date = sampling_date
            if review_date:
                report.review_date = review_date

            if cold_ufcl:
                report.cold_ufcl = cold_ufcl
            if cold_flow_ufcl:
                report.cold_flow_ufcl = cold_flow_ufcl
            if hot_ufcl:
                report.hot_ufcl = hot_ufcl
            if hot_flow_ufcl:
                report.hot_flow_ufcl = hot_flow_ufcl

            if cold_temperature:
                report.cold_temperature = cold_temperature
            if cold_flow_temperature:
                report.cold_flow_temperature = cold_flow_temperature
            if hot_temperature:
                report.hot_temperature = hot_temperature
            if hot_flow_temperature:
                report.hot_flow_temperature = hot_flow_temperature

            if cold_chlorine_dioxide:
                report.cold_chlorine_dioxide = cold_chlorine_dioxide
            if cold_flow_chlorine_dioxide:
                report.cold_flow_chlorine_dioxide = cold_flow_chlorine_dioxide
            if hot_chlorine_dioxide:
                report.hot_chlorine_dioxide = hot_chlorine_dioxide
            if hot_flow_chlorine_dioxide:
                report.hot_flow_chlorine_dioxide = hot_flow_chlorine_dioxide

            if fields_with_ids.get('cold_ufcl_type'):
                report.cold_ufcl_type = fields_with_ids.get('cold_ufcl_type')
            if fields_with_ids.get('cold_flow_ufcl_type'):
                report.cold_flow_ufcl_type = fields_with_ids.get(
                    'cold_flow_ufcl_type')
            if fields_with_ids.get('hot_ufcl_type'):
                report.hot_ufcl_type = fields_with_ids.get('hot_ufcl_type')
            if fields_with_ids.get('hot_flow_ufcl_type'):
                report.hot_flow_ufcl_type = fields_with_ids.get(
                    'hot_flow_ufcl_type')

            if fields_with_ids.get('cold_ufcl_sampling_selection'):
                report.cold_ufcl_sampling_selection = fields_with_ids.get(
                    'cold_ufcl_sampling_selection')
            if fields_with_ids.get('cold_flow_ufcl_sampling_selection'):
                report.cold_flow_ufcl_sampling_selection = fields_with_ids.get(
                    'cold_flow_ufcl_sampling_selection')
            if fields_with_ids.get('hot_ufcl_sampling_selection'):
                report.hot_ufcl_sampling_selection = fields_with_ids.get(
                    'hot_ufcl_sampling_selection')
            if fields_with_ids.get('hot_flow_ufcl_sampling_selection'):
                report.hot_flow_ufcl_sampling_selection = fields_with_ids.get(
                    'hot_flow_ufcl_sampling_selection')

            if 'notes_actions' in input.keys():
                report.notes_actions = ast.literal_eval(input['notes_actions'])
            if 'after_sampling_status' in input.keys():
                report.after_sampling_status = ast.literal_eval(
                    input['after_sampling_status'])

            report.save()
            return report
    def createReport(self, input):
        reportService = ReportService()
        rangeService = RangeService()

        # CAMPI CON ID (foreign key)
        fields = [
            ('wsp', 'Wsp', wsp_model),
            ('sample_range', 'SampleRange', samplerange_model),
            ('cold_ufcl_type', 'Settings', settings_model),
            ('cold_flow_ufcl_type', 'Settings', settings_model),
            ('cold_ufcl_sampling_selection', 'Settings', settings_model),
            ('cold_flow_ufcl_sampling_selection', 'Settings', settings_model),
            ('hot_ufcl_type', 'Settings', settings_model),
            ('hot_flow_ufcl_type', 'Settings', settings_model),
            ('hot_ufcl_sampling_selection', 'Settings', settings_model),
            ('hot_flow_ufcl_sampling_selection', 'Settings', settings_model)
        ]

        fields_with_ids = None
        try:
            fields_with_ids = {x[0]: extract_value_from_input(
                input=input,
                field_id=x[0],
                model_type=x[1],
                model=x[2]) for x in fields}
        except ObjectDoesNotExist as err:
            raise GraphQLError(
                u'Problemi durante il recupero di alcuni oggetti.'
            )

        # controllo se già presente un report per un wsp in quel samplerange
        param = {}
        param['sample_range'] = fields_with_ids.get('sample_range')
        param['wsp'] = fields_with_ids.get('wsp')

        if reportService.getReportListByDict(param):
            return GraphQLError(
                u'Esiste già un report di questo Wsp per questo '
                u'intervallo di campionamento',
            )

        # controllo che il samplerange a cui voglio assegnare il report
        # non abbia nemmeno un blocco attivato
        if fields_with_ids.get('sample_range').manager_block or \
            fields_with_ids.get('sample_range').tecnico_block or \
                fields_with_ids.get('sample_range').final_block:
            return GraphQLError(
                u'Non è possibile aggiungere un report ad un intervallo ' +
                u'di campionamento che è già stato bloccato o ' +
                u'parzialmente bloccato.'
            )

        # RANGE SETTINGS - info dal WSP e dal tipo di struttura associata.
        # La logica è: i range che sono per il tipo di struttura specificato
        # nei settings e che sono attivi.
        rangesettings = None
        if fields_with_ids.get('wsp'):
            wsp = fields_with_ids.get('wsp')
            wspstruct = wsp.structure.struct_type.value

            # controllo che il report vada ad inserire solo
            # i valori permessi dal wsp
            try:
                self._samevalue_report_wsp(wsp, input)
            except Exception as err:
                raise GraphQLError(
                    u'Questo report non accetta prelievi per il campo {0} '
                    u'perchè il WSP a lui associato non accetta prelievi '
                    u'per questo tipo di misurazioni {1}.'.format(
                        err.args[1], err.args[0])
                )

            param = {}
            param['range_type__setting_type'] = 'struct_type'
            param['range_type__value'] = wspstruct
            param['flag'] = True

            rangeobj = rangeService.getRangeListByDict(param)
            if not rangeobj:
                raise GraphQLError(
                    u"Non ce un range corretto attivabile per un questo "
                    u"tipo di struttura: {}".format(wspstruct))
            elif len(rangeobj) > 1:
                raise GraphQLError(
                    u"Ci sono troppi range attivi per questo tipo "
                    u"di struttura! {} ."
                    u"Correggi disattivando i vecchi range.".format(
                        wspstruct))

            rangesettings = rangeobj[0]

        sampling_date = None
        if input.get('sampling_date', None):
            sampling_date = datetime.datetime.strptime(
                input['sampling_date'],
                "%Y-%m-%d").date()

        review_date = None
        if input.get('review_date', None):
            review_date = datetime.datetime.strptime(
                input['review_date'],
                "%Y-%m-%d").date()

        notes_actions = None
        if input.get('notes_actions', None):
            notes_actions = ast.literal_eval(
                input['notes_actions']
            )

        after_sampling_status = None
        if input.get('after_sampling_status', None):
            after_sampling_status = ast.literal_eval(
                input['after_sampling_status']
            )

        # VALORI DI LEGIONELLA
        cold_ufcl = None
        if fields_with_ids.get('cold_ufcl_sampling_selection'):
            if fields_with_ids.get('cold_ufcl_sampling_selection').has_legionella_type:  # noqa
                cold_ufcl = input.get('cold_ufcl', 0)
            else:
                cold_ufcl = fields_with_ids.get(
                    'cold_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=cold_ufcl,
                value_name='cold_ufcl',
            )
        cold_flow_ufcl = None
        if fields_with_ids.get('cold_flow_ufcl_sampling_selection'):
            if fields_with_ids.get('cold_flow_ufcl_sampling_selection').has_legionella_type:  # noqa
                cold_flow_ufcl = input.get('cold_flow_ufcl', 0)
            else:
                cold_flow_ufcl = fields_with_ids.get(
                    'cold_flow_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=cold_flow_ufcl,
                value_name='cold_flow_ufcl',
            )
        hot_ufcl = None
        if fields_with_ids.get('hot_ufcl_sampling_selection'):
            if fields_with_ids.get('hot_ufcl_sampling_selection').has_legionella_type:  # noqa
                hot_ufcl = input.get('hot_ufcl', 0)
            else:
                hot_ufcl = fields_with_ids.get(
                    'hot_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=hot_ufcl,
                value_name='hot_ufcl',
            )
        hot_flow_ufcl = None
        if fields_with_ids.get('hot_flow_ufcl_sampling_selection'):
            if fields_with_ids.get('hot_flow_ufcl_sampling_selection').has_legionella_type:  # noqa
                hot_flow_ufcl = input.get('hot_flow_ufcl', 0)
            else:
                hot_flow_ufcl = fields_with_ids.get(
                    'hot_flow_ufcl_sampling_selection').int_value
            self._validateReportValue(
                setting=rangesettings.ufcl,
                value=hot_flow_ufcl,
                value_name='hot_flow_ufcl',
            )

        # VALORI DI BIOSSIDO
        cold_chlorine_dioxide = input.get('cold_chlorine_dioxide', None)
        if cold_chlorine_dioxide:
            self._validateReportValue(
                setting=rangesettings.chlorine_dioxide,
                value=cold_chlorine_dioxide,
                value_name='cold_chlorine_dioxide',
            )
        cold_flow_chlorine_dioxide = input.get(
            'cold_flow_chlorine_dioxide', None)
        if cold_flow_chlorine_dioxide:
            self._validateReportValue(
                setting=rangesettings.chlorine_dioxide,
                value=cold_flow_chlorine_dioxide,
                value_name='cold_flow_chlorine_dioxide',
            )
        hot_chlorine_dioxide = input.get('hot_chlorine_dioxide', None)
        if hot_chlorine_dioxide:
            self._validateReportValue(
                setting=rangesettings.chlorine_dioxide,
                value=hot_chlorine_dioxide,
                value_name='hot_chlorine_dioxide',
            )
        hot_flow_chlorine_dioxide = input.get(
            'hot_flow_chlorine_dioxide', None)
        if hot_flow_chlorine_dioxide:
            self._validateReportValue(
                setting=rangesettings.chlorine_dioxide,
                value=hot_flow_chlorine_dioxide,
                value_name='hot_flow_chlorine_dioxide',
            )

        # VALORI DI TEMPERATURA
        cold_temperature = input.get('cold_temperature', None)
        if cold_temperature:
            self._validateReportValue(
                setting=rangesettings.cold_temperature,
                value=cold_temperature,
                value_name='cold_temperature',
            )
        cold_flow_temperature = input.get('cold_flow_temperature', None)
        if cold_flow_temperature:
            self._validateReportValue(
                setting=rangesettings.cold_flow_temperature,
                value=cold_flow_temperature,
                value_name='cold_flow_temperature',
            )
        hot_temperature = input.get('hot_temperature', None)
        if hot_temperature:
            self._validateReportValue(
                setting=rangesettings.hot_temperature,
                value=hot_temperature,
                value_name='hot_temperature',
            )
        hot_flow_temperature = input.get('hot_flow_temperature', None)
        if hot_flow_temperature:
            self._validateReportValue(
                setting=rangesettings.hot_flow_temperature,
                value=hot_flow_temperature,
                value_name='hot_flow_temperature',
            )

        report = report_model(
            sample_range=fields_with_ids.get('sample_range'),
            wsp=fields_with_ids.get('wsp'),
            risk_level=fields_with_ids.get('wsp').risk_level,
            rangesettings=rangesettings,
            sampling_date=sampling_date,
            review_date=review_date,

            cold_ufcl=cold_ufcl,
            cold_flow_ufcl=cold_flow_ufcl,
            hot_ufcl=hot_ufcl,
            hot_flow_ufcl=hot_flow_ufcl,

            cold_temperature=cold_temperature,
            cold_flow_temperature=cold_flow_temperature,
            hot_temperature=hot_temperature,
            hot_flow_temperature=hot_flow_temperature,

            cold_chlorine_dioxide=cold_chlorine_dioxide,
            cold_flow_chlorine_dioxide=cold_flow_chlorine_dioxide,
            hot_chlorine_dioxide=hot_chlorine_dioxide,
            hot_flow_chlorine_dioxide=hot_flow_chlorine_dioxide,

            cold_ufcl_type=fields_with_ids.get('cold_ufcl_type'),
            cold_flow_ufcl_type=fields_with_ids.get('cold_flow_ufcl_type'),
            hot_ufcl_type=fields_with_ids.get('hot_ufcl_type'),
            hot_flow_ufcl_type=fields_with_ids.get('hot_flow_ufcl_type'),

            cold_ufcl_sampling_selection=fields_with_ids.get(
                'cold_ufcl_sampling_selection'),
            cold_flow_ufcl_sampling_selection=fields_with_ids.get(
                'cold_flow_ufcl_sampling_selection'),
            hot_ufcl_sampling_selection=fields_with_ids.get(
                'hot_ufcl_sampling_selection'),
            hot_flow_ufcl_sampling_selection=fields_with_ids.get(
                'hot_flow_ufcl_sampling_selection'),

            notes_actions=notes_actions,
            after_sampling_status=after_sampling_status,
        )

        report.save()
        return report
Beispiel #11
0
    def updateSampleRange(self, input, user_groups):
        settingService = SettingService()

        try:
            samranobj = extract_value_from_input(input, 'samplerange_id',
                                                 'SampleRange',
                                                 samplerange_model)
        except ObjectDoesNotExist:
            raise GraphQLError(u'Problemi durante il recupero di un ' +
                               u'intervallo di campionamento.')

        # Raccolgo le informazioni sui permessi dell'utente
        param = {}
        param['setting_type'] = 'field_permission'
        param['value__contains'] = 'SampleRange.'
        param['owner__in'] = user_groups

        fields_with_permission = settingService.getSettingListByDict(param)

        # PRIMO STEP DI CONTROLLI
        # controllo sui vari block
        # passato questo controllo, si stanno modifcando i dati
        if samranobj.final_block:
            raise GraphQLError(u"Non è possibile modificare un Intervallo di "
                               u"campionamento che è stato finalizzato.")

        if 'manager_block' in input:
            if check_samplerange_block('manager_block',
                                       fields_with_permission):
                samranobj.manager_block = True
                samranobj.save()
                return samranobj

        if 'tecnico_block' in input:
            if check_samplerange_block('tecnico_block',
                                       fields_with_permission):
                samranobj.tecnico_block = True
                samranobj.save()
                return samranobj

        # SECONDO STEP DI CONTROLLI - sui singoli campi modificabili
        # controllo se è stato messo un blocco parziale, nel caso in cui sia
        # stato messo allora non deve essere possibile modificare i campi
        # relativi a quel block.
        # recupero i campi manager_block e tecnico_block

        if samranobj.manager_block:
            # controllo che all'interno dell'input ci siano campi bloccati
            for field in fields_with_permission:
                # TODO -> da fixare questo controllo
                if (field.value.split('SampleRange.', 1)[1] in input
                        and field.value.split('SampleRange.',
                                              1)[1] != u'final_block'):
                    raise GraphQLError(
                        u'Non è possibile modificare il campo {0}'.format(
                            field.value) +
                        u', perchè il blocco manager è già stato attivato.')
        elif samranobj.tecnico_block:
            # controllo che all'interno dell'input ci siano campi bloccati
            for field in fields_with_permission:
                if field.value.split('SampleRange.', 1)[1] in input:
                    raise GraphQLError(
                        u'Non è possibile modificare il campo {0}'.format(
                            field.value) +
                        u', perchè il blocco tecnico è già stato attivato.')

        if input.get('samplerange_id', None):
            # aggiorno i campi che non blocchi
            if 'dates_list' in input.keys():
                samranobj.dates_list = input.get('dates_list', None)
            if 'company' in input.keys():
                samranobj.company = input.get('company', None)
            if 'title' in input.keys():
                samranobj.title = input.get('title', None)
            if 'description' in input.keys():
                samranobj.description = input.get('description', None)
            if 'filter_on' in input.keys():
                samranobj.filter_on = input.get('filter_on', None)

            # controllo sui blocchi
            manager_block = input.get('manager_block', None)
            tecnico_block = input.get('tecnico_block', None)
            final_block = input.get('final_block', None)

            # sistemare i controlli qui
            if manager_block:
                samranobj.manager_block = True
            elif tecnico_block:
                samranobj.tecnico_block = True
            if final_block:
                if samranobj.manager_block and samranobj.tecnico_block:
                    samranobj.final_block = True

                    # Chiamo il service per il freeze del sample range
                    sampleRangeFreezeService = SampleRangeFreezeService()
                    freeze_date, reportFreezeList = sampleRangeFreezeService.freeze(
                        samranobj)
                    if freeze_date:
                        samranobj.freeze_date = freeze_date
                        samranobj.reports_freeze = reportFreezeList
                    else:
                        raise GraphQLError(
                            u"Qualcosa è andato storto con il blocco" +
                            u"dell'intervallo di campionamento.")

                else:
                    raise GraphQLError(
                        u"Non si può bloccare l'intervallo di campionamento," +
                        u"senza il blocco tecnico e manager.")

            samranobj.save()
            return samranobj