Example #1
0
class FormCriarSubestacaoAerea(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    bloco = QuerySelectField(
        'Bloco',
        query_factory=lambda:
        # Mostrar apenas blocos especiais de subestação
        Bloco.query.filter(Bloco.nome.like('Subestações%')).order_by('nome').
        all())

    localizacao = GeoJSONField(
        'Localização',
        srid=-1,
        session=db.session,
        geometry_type='POINT',
        # Aumentar o mapa e centralizar em Fortaleza
        render_kw={
            'data-width': 400,
            'data-height': 400,
            'data-zoom': 10,
            'data-lat': -3.7911773,
            'data-lng': -38.5893123
        })

    detalhe_localizacao = TextAreaField('Detalhe de Localização')
Example #2
0
class FormEditarSubestacaoAerea(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    bloco = QuerySelectField(
        'Bloco',
        query_factory=lambda:
        # Mostrar apenas blocos especiais de subestação
        Bloco.query.filter(Bloco.nome.like('Subestações%')).order_by('nome').
        all())

    localizacao = GeoJSONField(
        'Localização',
        srid=-1,
        session=db.session,
        geometry_type='POINT',
        # Aumentar o mapa
        render_kw={
            'data-width': 400,
            'data-height': 400
        })

    detalhe_localizacao = TextAreaField('Detalhe de Localização')

    equipamentos = QuerySelectMultipleField(
        'Equipamentos',
        allow_blank=True,
        query_factory=lambda: Equipamento.query.order_by('tipo_equipamento'
                                                         ).all())
Example #3
0
class FormEditarAmbienteInterno(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    andar = Select2Field('Andar',
                         choices=[('Térreo', 'Térreo')] +
                         [(str(n) + 'º Andar', str(n) + 'º Andar')
                          for n in range(1, 11)])

    bloco = QuerySelectField(
        'Bloco', query_factory=lambda: Bloco.query.order_by('nome').all())

    detalhe_localizacao = TextAreaField('Detalhe de Localização')

    area = DecimalField('Área (m²)',
                        use_locale=True,
                        validators=[Optional(), NumberRange(0)])

    populacao = IntegerField('População',
                             validators=[Optional(),
                                         NumberRange(0)])

    equipamentos = QuerySelectMultipleField(
        'Equipamentos',
        allow_blank=True,
        query_factory=lambda: Equipamento.query.order_by('tipo_equipamento'
                                                         ).all())
Example #4
0
class FormCriarAmbienteExterno(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    bloco = QuerySelectField(
        'Bloco', query_factory=lambda: Bloco.query.order_by('nome').all())

    detalhe_localizacao = TextAreaField('Detalhe de Localização')
Example #5
0
class SelectShopForm(FlaskForm):
    shop = QuerySelectField(
        "Shop",
        query_factory=lambda: Shop.query.all(),
        get_pk=lambda x: x.id,
        get_label=lambda x: x.name,
        validators=[DataRequired("Bitte wähle den Zielshop.")])
Example #6
0
class FormEditarCentro(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    campus = QuerySelectField(
        'Campus', query_factory=lambda: Campus.query.order_by('nome').all())

    mapeamento = GeoJSONField(
        'Mapeamento',
        srid=-1,
        session=db.session,
        geometry_type='MULTIPOLYGON',
        # Aumentar o mapa
        render_kw={
            'data-width': 400,
            'data-height': 400
        })

    departamentos = QuerySelectMultipleField(
        'Departamentos',
        allow_blank=True,
        query_factory=lambda: Departamento.query.order_by('nome').all())

    # Inicialização
    def __init__(self, *args, **kwargs):
        super(FormEditarCentro, self).__init__(*args, **kwargs)

        # Existe um problema com a extensão Leaflet que não permite
        # a edição de mapas com polígonos.
        flash('No momento, a edição de mapeamento não é possível.', 'info')
Example #7
0
class FormEditarUsuario(FormBase):
    nome = StringField('Nome',
                       validators=[
                           InputRequired(),
                           Length(1, 64),
                           Regexp(u'[A-Za-z ÁÉÍÓÚÂÊÎÔÛÃÕÇáéíóúâêîôûãõç]*$')
                       ])

    email = StringField('Email',
                        validators=[InputRequired(),
                                    Length(1, 64),
                                    Email()])

    cargo = QuerySelectField(
        'Cargo', query_factory=lambda: Cargo.query.order_by('nome').all())

    verificado = BooleanField('Verificado')

    # Certificar que, se houve alteração no email, o novo é diferente dos já cadastrados
    def validate_email(self, field):
        if Usuario.query.filter_by(email=field.data).first() and \
                field.data != Usuario.query.get(request.args.get('id')).email:
            raise ValidationError('Email já cadastrado.')

    # Avisar ao administrador quando a verificação de um usuário é alterada de
    # verdadeira para falsa
    def validate_verificado(self, field):
        if Usuario.query.get(request.args.get('id')).verificado and \
                field.data == False:
            flash(
                'Você retirou a verificação deste usuário, e ele não poderá mais acessar o sistema.',
                'warning')
Example #8
0
class FormEditarDepartamento(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    centro = QuerySelectField(
        'Centro', query_factory=lambda: Centro.query.order_by('nome').all())

    blocos = QuerySelectMultipleField(
        'Blocos',
        allow_blank=True,
        query_factory=lambda: Bloco.query.order_by('nome').all())
Example #9
0
class FormCriarUnidadeConsumidora(FormBase):
    num_cliente = IntegerField('Número do Cliente',
                               validators=[InputRequired(),
                                           NumberRange(0)])

    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    unidade_responsavel = QuerySelectField(
        'Unidade Responsável',
        query_factory=lambda: UnidadeResponsavel.query.order_by('nome').all(),
        validators=[InputRequired()])

    endereco = StringField('Endereço',
                           validators=[InputRequired(),
                                       Length(1, 300)])

    localizacao = GeoJSONField(
        'Localização',
        srid=-1,
        session=db.session,
        geometry_type='POINT',
        # Aumentar o mapa e centralizar em Fortaleza
        render_kw={
            'data-width': 400,
            'data-height': 400,
            'data-zoom': 10,
            'data-lat': -3.7911773,
            'data-lng': -38.5893123
        })

    mod_tarifaria = Select2Field(
        'Modalidade Tarifária',
        choices=[('Horária Verde', 'Horária Verde')],
        #('Convencional Monômia', 'Convencional Monômia')],
        validators=[InputRequired()])

    num_medidores = IntegerField('Número dos Medidores',
                                 validators=[InputRequired(),
                                             NumberRange(0)])

    # Certificar que o número de cliente ainda não existe
    def validate_num_cliente(self, field):
        if UnidadeConsumidora.query.filter_by(num_cliente=field.data).first():
            raise ValidationError('Unidade já cadastrada.')

    # Certificar que o nome é diferente dos já cadastrados
    def validate_nome(self, field):
        if UnidadeConsumidora.query.filter_by(nome=field.data).first():
            raise ValidationError('Unidade já cadastrada.')

    # Certificar que o número de cliente ainda não existe
    def validate_num_medidores(self, field):
        if UnidadeConsumidora.query.filter_by(
                num_medidores=field.data).first():
            raise ValidationError('Número já cadastrado.')
Example #10
0
class FormEditarCondicionadorAr(FormBase):
    # Caso não haja número de tombamento, usar 0
    tombamento = IntegerField('Tombamento', validators=[NumberRange(0)])

    classificacao = Select2Field('Classificação',
                                 choices=[('Split', 'Split'),
                                          ('Janela', 'Janela'),
                                          ('Teto Aparente', 'Teto Aparente'),
                                          ('Piso Aparente', 'Piso Aparente')])

    cap_refrigeracao = IntegerField('Capacidade de Refrigeração (Btu/h)',
                                    validators=[NumberRange(0)])

    pot_nominal = IntegerField('Potência Nominal de Entrada (W)',
                               validators=[Optional(),
                                           NumberRange(0)])

    tensao_alimentacao = Select2Field('Tensão de Alimentação (V)',
                                      choices=[(220, '220'), (380, '380')],
                                      coerce=int,
                                      validators=[InputRequired()])

    eficiencia = Select2Field('Eficiência (Selo Procel)',
                              choices=[('A', 'A'), ('B', 'B'), ('C', 'C'),
                                       ('D', 'D'), ('E', 'E'), ('F', 'F'),
                                       ('G', 'G')])

    fabricante = StringField('Fabricante', validators=[Length(1, 64)])

    ambiente = QuerySelectField(
        'Ambiente',
        query_factory=lambda: Ambiente.query.order_by('nome').all())

    intervalo_manutencao = IntegerField(
        'Intervalo de Manutenção (Meses)',
        validators=[InputRequired(), NumberRange(0)])

    em_uso = BooleanField('Em Uso')

    info_adicional = TextAreaField('Informações Adicionais')

    manutencoes = QuerySelectMultipleField(
        'Manutenções',
        query_factory=lambda: Manutencao.query.all(),
        allow_blank=True)

    # Certificar que, se houve alteração no número de tombamento, o novo número
    # não é de um equipamento já existente
    def validate_tombamento(self, field):
        # Desconsiderar o caso 0 (quando não há número de tombamento)
        if field.data != 0:
            if Equipamento.query.filter_by(tombamento=field.data).first() and \
               field.data != Equipamento.query.get(request.args.get('id')).tombamento:
                raise ValidationError('Equipamento já cadastrado.')
Example #11
0
class AreaModelView(ModelView):
    column_hide_backrefs = False
    form_extra_fields = {
        'ancestor': QuerySelectField(
            label='Ancestor',
            query_factory=lambda: Area.query.all(),
            widget=Select2Widget()
        )
    }

    def on_model_change(self, form, model, is_created):
        if not is_created and form.ancestor.data.id == model.id:
            model.ancestor_id = 1
Example #12
0
class FormEditarAmbienteExterno(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    bloco = QuerySelectField(
        'Bloco', query_factory=lambda: Bloco.query.order_by('nome').all())

    detalhe_localizacao = TextAreaField('Detalhe de Localização')

    equipamentos = QuerySelectMultipleField(
        'Equipamentos',
        allow_blank=True,
        query_factory=lambda: Equipamento.query.order_by('tipo_equipamento'
                                                         ).all())
Example #13
0
 def convert_foreign_key(self, column, field_args, **extra):
     loader = getattr(self.view, '_form_ajax_refs', {}).get(column.name)
     if loader:
         return AjaxSelectField(loader, **field_args)
     if 'query_factory' not in field_args:
         remote_model = None
         remote_column = None
         for foreign_key in column.foreign_keys:
             remote_column = foreign_key.column
             remote_model = MODELS[remote_column.table.fullname]
         field_args['query_factory'] = (lambda: [
             getattr(obj, remote_column.name)
             for obj in self.session.query(remote_model).all()
         ])
         field_args['get_pk'] = lambda obj: obj
         field_args['get_label'] = lambda obj: obj
     return QuerySelectField(**field_args)
Example #14
0
class FormEditarExtintor(FormBase):
    # Caso não haja número de tombamento, usar 0
    tombamento = IntegerField('Tombamento', validators=[NumberRange(0)])

    classificacao = Select2Field('Classificação',
                                 choices=[
                                     ('Água [A]', 'Água [A]'),
                                     ('Espuma [AB]', 'Espuma [AB]'),
                                     ('CO2 [BC]', 'CO2 [BC]'),
                                     ('Pó Químico [BC]', 'Pó Químico [BC]'),
                                     ('Pó Químico [ABC]', 'Pó Químico [ABC]')
                                 ],
                                 validators=[InputRequired()])

    carga_nominal = DecimalField('Carga Nominal (kg)',
                                 use_locale=True,
                                 validators=[NumberRange(0)])

    fabricante = StringField('Fabricante', validators=[Length(1, 64)])

    ambiente = QuerySelectField(
        'Ambiente',
        query_factory=lambda: Ambiente.query.order_by('nome').all())

    intervalo_manutencao = IntegerField(
        'Intervalo de Manutenção (Meses)',
        validators=[InputRequired(), NumberRange(0)])

    em_uso = BooleanField('Em Uso')

    info_adicional = TextAreaField('Informações Adicionais')

    manutencoes = QuerySelectMultipleField(
        'Manutenções',
        query_factory=lambda: Manutencao.query.all(),
        allow_blank=True)

    # Certificar que, se houve alteração no número de tombamento, o novo número
    # não é de um equipamento já existente
    def validate_tombamento(self, field):
        # Desconsiderar o caso 0 (quando não há número de tombamento)
        if field.data != 0:
            if Equipamento.query.filter_by(tombamento=field.data).first() and \
               field.data != Equipamento.query.get(request.args.get('id')).tombamento:
                raise ValidationError('Equipamento já cadastrado.')
Example #15
0
class FormCriarCentro(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    campus = QuerySelectField(
        'Campus', query_factory=lambda: Campus.query.order_by('nome').all())

    mapeamento = GeoJSONField(
        'Mapeamento',
        srid=-1,
        session=db.session,
        geometry_type='MULTIPOLYGON',
        # Aumentar o mapa e centralizar em Fortaleza
        render_kw={
            'data-width': 400,
            'data-height': 400,
            'data-zoom': 10,
            'data-lat': -3.7911773,
            'data-lng': -38.5893123
        })
Example #16
0
class FormCriarBloco(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    departamento = QuerySelectField(
        'Departamento',
        query_factory=lambda: Departamento.query.order_by('nome').all())

    localizacao = GeoJSONField(
        'Localização',
        srid=-1,
        session=db.session,
        geometry_type='POINT',
        # Aumentar o mapa e centralizar em Fortaleza
        render_kw={
            'data-width': 400,
            'data-height': 400,
            'data-zoom': 10,
            'data-lat': -3.7911773,
            'data-lng': -38.5893123
        })
Example #17
0
class FormEditarBloco(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    departamento = QuerySelectField(
        'Departamento',
        query_factory=lambda: Departamento.query.order_by('nome').all())

    localizacao = GeoJSONField(
        'Localização',
        srid=-1,
        session=db.session,
        geometry_type='POINT',
        # Aumentar o mapa
        render_kw={
            'data-width': 400,
            'data-height': 400
        })

    ambientes = QuerySelectMultipleField(
        'Ambientes',
        allow_blank=True,
        query_factory=lambda: Ambiente.query.order_by('nome').all())
Example #18
0
class UpdateProductForm(FlaskForm):
    categories = QuerySelectField('Categorias',
                                  query_factory=enabled_categories,
                                  allow_blank=False,
                                  get_label='title',
                                  get_pk=lambda c: c.id,
                                  blank_text=u'Selecione uma categoria...')

    description = StringField(
        'Descrição',
        validators=[
            Length(min=3, max=64),
            Regexp(
                '^([A-Za-z0-9\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s\.\-]*)$'
            )
        ])

    unit_cost = DecimalField('Preço',
                             validators=[NumberRange(min=0.5, max=100.0)])
    code = StringField('Código', render_kw={'disabled': ''})
    is_available = BooleanField("Está disponível")
    submit = SubmitField('Salvar')
Example #19
0
class FormEditarConta(FormBase):
    unidade_consumidora = QuerySelectField(
        'Unidade Consumidora',
        query_factory=lambda: UnidadeConsumidora.query.order_by('nome').all(),
        validators=[InputRequired()])

    data_leitura = DateField('Data da Leitura',
                             widget=DatePickerWidget(),
                             render_kw={'data-date-format': 'DD.MM.YYYY'},
                             format='%d.%m.%Y',
                             validators=[InputRequired()])

    cons_fora_ponta = IntegerField(
        'Consumo Fora de Ponta (kWh)',
        validators=[InputRequired(), NumberRange(0)])

    cons_hora_ponta = IntegerField(
        'Consumo Hora Ponta (kWh)',
        validators=[InputRequired(), NumberRange(0)])

    valor_fora_ponta = DecimalField(
        'Valor Fora de Ponta (R$)',
        use_locale=True,
        validators=[InputRequired(), NumberRange(0)])

    valor_hora_ponta = DecimalField(
        'Valor Hora Ponta (R$)',
        use_locale=True,
        validators=[InputRequired(), NumberRange(0)])

    valor_total = DecimalField('Valor Total (R$)',
                               use_locale=True,
                               validators=[InputRequired(),
                                           NumberRange(0)])

    # Certificar que a data da leitura não seja no futuro
    def validate_data_leitura(self, field):
        if field.data > date.today():
            raise ValidationError('Não é possível cadastrar datas no futuro.')
Example #20
0
class FormCriarUsuario(FormBase):
    nome = StringField('Nome',
                       validators=[
                           InputRequired(),
                           Length(1, 64),
                           Regexp(u'[A-Za-z ÁÉÍÓÚÂÊÎÔÛÃÕÇáéíóúâêîôûãõç]*$')
                       ])

    email = StringField('Email',
                        validators=[InputRequired(),
                                    Length(1, 64),
                                    Email()])

    senha = PasswordField('Senha', validators=[InputRequired(), Length(6, 16)])

    cargo = QuerySelectField(
        'Cargo', query_factory=lambda: Cargo.query.order_by('nome').all())

    confirmado = BooleanField('Confirmado')

    # Certificar que o email é diferente dos já cadastrados
    def validate_email(self, field):
        if Usuario.query.filter_by(email=field.data).first():
            raise ValidationError('Email já cadastrado.')
class THCResultForm1(form.Form):
    team = QuerySelectField("Team", [InputRequired()])
    session_name = StringField("Session Name", [InputRequired()])
    date = DateTimeField("Session Date", [InputRequired()])
    deck = Select2Field("Question Deck", [InputRequired()])
    form_step = HiddenField(default=1)
Example #22
0
class FormCriarDepartamento(FormBase):
    nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)])

    centro = QuerySelectField(
        'Centro', query_factory=lambda: Centro.query.order_by('nome').all())
Example #23
0
class FormCriarManutencao(FormBase):
    # Caso não haja número de ordem de serviço, usar 0
    num_ordem_servico = IntegerField(
        'Número da Ordem de Serviço',
        validators=[InputRequired(), NumberRange(0)])

    data_abertura = DateField('Data de Abertura',
                              widget=DatePickerWidget(),
                              render_kw={'data-date-format': 'DD.MM.YYYY'},
                              format='%d.%m.%Y',
                              default=date.today(),
                              validators=[InputRequired()])

    data_conclusao = DateFieldMod('Data de Conclusão',
                                  widget=DatePickerWidget(),
                                  render_kw={'data-date-format': 'DD.MM.YYYY'},
                                  format='%d.%m.%Y',
                                  validators=[])

    tipo_manutencao = Select2Field('Tipo de Manutenção',
                                   choices=[('Preventiva', 'Preventiva'),
                                            ('Corretiva', 'Corretiva'),
                                            ('Troca', 'Troca'),
                                            ('Inicial', 'Inicial')])

    equipamento = QuerySelectField('Equipamento',
        query_factory=lambda:
            Equipamento.query.filter_by(em_uso=True).filter_by(em_manutencao=False)\
                             .order_by('tipo_equipamento').all())

    descricao_servico = TextAreaField('Descrição do Serviço')

    status = Select2Field('Status',
                          choices=[('Aberta', 'Aberta'),
                                   ('Concluída', 'Concluída')])

    # Inicialização
    def __init__(self, *args, **kwargs):
        super(FormCriarManutencao, self).__init__(*args, **kwargs)

        # Caso o id de um equipamento esteja presente na query string, o campo
        # de equipamento é automaticamente preenchido
        if request.args.get('id'):
            # Buscar equipamento no banco de dados e preencher campo no formulário
            self.equipamento.data = Equipamento.query.get(
                request.args.get('id'))

            # Desativar edição do campo de equipamento
            self.equipamento.render_kw = dict(disabled='disabled')

            # Caso um parâmetro de tipo de manutenção seja passado pela query string,
            # alguns campos relevantes são preenchidos automaticamente, de acordo com
            # o tipo de manutenção

            # Manutenção tipo inicial
            if request.args.get('tipo') == 'inicial':
                # Preencher o campo de tipo de manutenção e desabilitar sua edição
                self.tipo_manutencao.data = 'Inicial'
                self.tipo_manutencao.render_kw = dict(disabled='disabled')

                # Preencher o campo de status e desabilitar sua edição
                self.status.data = 'Concluída'
                self.status.render_kw = dict(disabled='disabled')

    # Certificar que o número da ordem de serviço seja diferente dos já existentes
    def validate_num_ordem_servico(self, field):
        # Desconsiderar o caso 0 (quando não há número de ordem de serviço)
        if field.data != 0:
            if Manutencao.query.filter_by(
                    num_ordem_servico=field.data).first():
                raise ValidationError('Manutenção já cadastrada.')

    # Certificar que a data de abertura não seja no futuro
    def validate_data_abertura(self, field):
        if field.data > date.today():
            raise ValidationError('Não é possível cadastrar datas no futuro.')

    # Certificar que, se a manutenção foi concluída, uma data de conclusão foi
    # inserida e que esta data não seja no futuro, nem anterior à data de abertura
    def validate_data_conclusao(self, field):
        if self.status.data == 'Concluída':
            # Testar se foi inserida data de conclusão
            if field.data is None:
                raise ValidationError('Cadastre a data de conclusão.')

            # Testar se a data está no futuro
            if field.data > date.today():
                raise ValidationError(
                    'Não é possível cadastrar datas no futuro.')

            # Testar se a data de conclusão não é anterior à data de abertura
            if field.data < self.data_abertura.data:
                raise ValidationError(
                    'Data de conclusão anterior à data de abertura.')

    # Certificar que não seja possível abrir uma nova manutenção para
    # um equipamento que já possua uma manutenção aberta
    def validate_equipamento(self, field):
        if self.status.data == 'Aberta' and field.data.em_manutencao:
            raise ValidationError(
                'Equipamento já em manutenção. Conclua a última manutenção.')

    # Certificar que se uma data de conclusão foi inserida, o status da
    # manutenção deve ser "Concluída"
    def validate_status(self, field):
        if self.data_conclusao.data:
            if field.data == 'Aberta':
                raise ValidationError(
                    'Data de Conclusão cadastrada. Mude Status para "Concluída" ou deixe \
                     Data de Conclusão em branco.')

    # Certificar que não seja possível criar uma manutenção inicial para
    # um equipamento que já possua uma.
    # A manutenção inicial só será cadastrada por meio deste formulário quando
    # um equipamento é criado e o usuário opta por cadastrar uma manutenção
    # inicial personalizada.
    def validate_tipo_manutencao(self, field):
        # Caso haja o argumento 'tipo' com valor 'inicial' na query string, esta
        # é de fato a manutenção inicial do equipamento, e será validada, do contrário,
        # não será possível criar outra manutenção inicial.
        if field.data == 'Inicial' and request.args.get('tipo') != 'inicial':
            raise ValidationError(
                'Este equipamento já possui manutenção inicial. Edite a exstente.'
            )
Example #24
0
class FormEditarManutencao(FormBase):
    # Caso não haja número de ordem de serviço, usar 0
    num_ordem_servico = IntegerField(
        'Número da Ordem de Serviço',
        validators=[InputRequired(), NumberRange(0)])

    data_abertura = DateField('Data de Abertura',
                              widget=DatePickerWidget(),
                              render_kw={'data-date-format': 'DD.MM.YYYY'},
                              format='%d.%m.%Y',
                              validators=[InputRequired()])

    data_conclusao = DateFieldMod('Data de Conclusão',
                                  widget=DatePickerWidget(),
                                  render_kw={'data-date-format': 'DD.MM.YYYY'},
                                  format='%d.%m.%Y')

    tipo_manutencao = Select2Field('Tipo de Manutenção',
                                   choices=[('Preventiva', 'Preventiva'),
                                            ('Corretiva', 'Corretiva'),
                                            ('Troca', 'Troca'),
                                            ('Inicial', 'Inicial')])

    equipamento = QuerySelectField('Equipamento',
        query_factory=lambda:
            Equipamento.query.filter_by(em_uso=True)\
                             .order_by('tipo_equipamento').all())

    descricao_servico = TextAreaField('Descrição do Serviço')

    status = Select2Field('Status',
                          choices=[('Aberta', 'Aberta'),
                                   ('Concluída', 'Concluída')])

    # Inicialização
    def __init__(self, *args, **kwargs):
        super(FormEditarManutencao, self).__init__(*args, **kwargs)

        # A edição do campo de equipamento sempre será desabilitada, para evitar
        # comprometimento do banco de dados.
        self.equipamento.render_kw = dict(disabled='disabled')

        # Obter o id da manutenção
        id_manutencao = request.args.get('id')

        # Caso a manutenção seja do tipo inicial, desabilitar edição dos campos
        # de tipo de manutenção e de status
        if Manutencao.query.get(id_manutencao).tipo_manutencao == 'Inicial':
            self.tipo_manutencao.render_kw = dict(disabled='disabled')
            self.status.render_kw = dict(disabled='disabled')

    # Certificar que, se houve alteração no número da ordem de serviço,
    # o novo número seja diferente dos já existentes
    def validate_num_ordem_servico(self, field):
        # Desconsiderar o caso 0 (quando não há número de ordem de serviço)
        if field.data != 0:
            if Manutencao.query.filter_by(num_ordem_servico=field.data).first() and \
               field.data != Manutencao.query.get(request.args.get('id')).num_ordem_servico:
                raise ValidationError('Manutenção já cadastrada.')

    # Certificar que a data de abertura não seja no futuro
    def validate_data_abertura(self, field):
        if field.data > date.today():
            raise ValidationError('Não é possível cadastrar datas no futuro.')

    # Certificar que, se a manutenção foi concluída, uma data de conclusão foi
    # inserida e que esta data não seja no futuro, nem anterior à data de abertura
    def validate_data_conclusao(self, field):
        if self.status.data == 'Concluída':
            # Testar se foi inserida data de conclusão
            if field.data is None:
                raise ValidationError('Cadastre a data de conclusão.')

            # Testar se a data está no futuro
            if field.data > date.today():
                raise ValidationError(
                    'Não é possível cadastrar datas no futuro.')

            # Testar se a data de conclusão não é anterior à data de abertura
            if field.data < self.data_abertura.data:
                raise ValidationError(
                    'Data de conclusão anterior à data de abertura.')

    # Certificar que se uma data de conclusão foi inserida, o status da
    # manutenção deve ser "Concluída"
    def validate_status(self, field):
        if self.data_conclusao.data:
            if field.data == 'Aberta':
                raise ValidationError(
                    'Data de Conclusão cadastrada. Mude Status para "Concluída" ou deixe \
                     Data de Conclusão em branco.')

    # Certificar que não seja possível mudar o tipo de manutenção para 'Inicial',
    # pois o equipamento só pode ter uma manutenção inicial
    def validate_tipo_manutencao(self, field):
        # Caso a própria manutenção inicial não esteja sendo editada e o usuário
        # tentar mudar o tipo de manutenção para 'Inicial', não será validado.
        if field.data == 'Inicial' and \
                Manutencao.query.get(request.args.get('id')).tipo_manutencao != 'Inicial':
            raise ValidationError(
                'Este equipamento já possui manutenção inicial. Edite a exstente.'
            )
Example #25
0
class MyPersonView(MyModelView):
    def get_query(self):
        if login.current_user.has_role('posel2'):
            return self.session.query(
                self.model).filter(self.model.hostel_id == 1)
        elif login.current_user.has_role('posel3'):
            return self.session.query(
                self.model).filter(self.model.hostel_id == 2)
        elif login.current_user.has_role('posel4'):
            return self.session.query(
                self.model).filter(self.model.hostel_id == 3)
        else:
            return self.session.query(self.model)

    def get_count_query(self):
        if login.current_user.has_role('posel2'):
            return self.session.query(func.count('*')).select_from(
                self.model).filter(self.model.hostel_id == 1)
        elif login.current_user.has_role('posel3'):
            return self.session.query(func.count('*')).select_from(
                self.model).filter(self.model.hostel_id == 2)
        elif login.current_user.has_role('posel4'):
            return self.session.query(func.count('*')).select_from(
                self.model).filter(self.model.hostel_id == 3)
        else:
            return self.session.query(func.count('*')).select_from(self.model)

    @action('approve', 'Выселить', 'Вы уверены, что хотите выселить?')
    def action_approve(self, ids):
        try:
            query = models.Person.query.filter(models.Person.id.in_(ids))
            count = 0
            for user in query.all():
                try:
                    db.session.add(models.Person_old(user))
                    models.Room_free.query.filter_by(
                        room_id=user.room).first().places += 1
                    db.session.commit()
                except Exception:
                    print('error')
                finally:
                    db.session.delete(user)
                    db.session.commit()
                count += 1
            flash('Выселено', '%s users were successfully approved.' % count)
        except Exception as ex:
            if not self.handle_view_exception(ex):
                raise

    column_exclude_list = ('id', 'parents', 'index', 'note', 'invite',
                           'phone_number_parent', 'street', 'passport',
                           'department', 'group', 'form_of_education',
                           'hostel_id', 'room_id', 'birthday', 'district',
                           'email', 'start_date', 'end_date')
    column_searchable_list = ('first_name', 'last_name')
    edit_modal = True
    create_modal = True
    can_export = True
    export_types = ['xlsx']
    column_export_exclude_list = ['person_room']
    column_editable_list = ['first_name', 'last_name']
    column_labels = {
        'first_name': 'Фамилия',
        'last_name': 'Имя',
        'middle_name': 'Отчество'
    }
    column_auto_select_related = True

    form_extra_fields = {
        'person_room':
        QuerySelectField(label='Комната',
                         query_factory=lambda: models.Room.query.filter_by(
                             hostel_id=1).all()
                         if login.current_user.has_role('posel2') else models.
                         Room.query.filter_by(hostel_id=2).all()
                         if login.current_user.has_role('posel3') else models.
                         Room.query.filter_by(hostel_id=4).all()
                         if login.current_user.has_role(
                             'posel4') else models.Room.query.all(),
                         widget=Select2Widget())
    }
Example #26
0
class OrganizationAdmin(ModelViewWithAccess):

    from psi.app.views.formatter import organization_formatter

    uos = 'UPDATE ' + Organization.__tablename__ + ' SET'

    @property
    def can_create(self):
        return is_super_admin()

    @property
    def can_delete(self):
        return is_super_admin()

    def get_query(self):
        return self.get_query_based_on_user(self.model)

    def get_count_query(self):
        return self.get_query_based_on_user(func.count('*'))

    def get_query_based_on_user(self, return_query):
        all_ids = Organization.get_children_self_ids(current_user.organization)
        return (self.session.query(return_query).filter(
            self.model.id.in_(all_ids))
                if not is_super_admin() else self.session.query(return_query))

    column_list = (
        'id',
        'name',
        'description',
        'type',
        'parent',
        'immediate_children',
    )

    column_sortable_list = ('id', 'name', 'description', 'type')

    column_searchable_list = ('name', 'description', 'parent.name',
                              'parent.description', 'lft', 'rgt', 'type.code',
                              'type.display')

    column_labels = dict(
        id=lazy_gettext('id'),
        name=lazy_gettext('Name'),
        description=lazy_gettext('Description'),
        parent=lazy_gettext('Parent Organization'),
        lft=lazy_gettext('Left'),
        rgt=lazy_gettext('Right'),
        type=lazy_gettext('Type'),
        immediate_children=lazy_gettext('Immediate Children'),
        all_children=lazy_gettext('All Children'),
    )

    form_args = dict(type=dict(query_factory=Organization.type_filter))

    column_formatters = {
        'immediate_children': organization_formatter,
        'all_children': organization_formatter,
        'parent': organization_formatter
    }
    column_editable_list = ('description', )

    form_excluded_columns = (
        'lft',
        'rgt',
    )

    form_extra_fields = {
        'parent':
        QuerySelectField(
            label=lazy_gettext('Parent Organization'),
            query_factory=lambda: Organization.query.all(),
            widget=Select2Widget(),
            allow_blank=False,
        )
    }

    def edit_form(self, obj=None):
        form = super(OrganizationAdmin, self).edit_form(obj)
        # form.parent._data_list is None at this moment, so it's not feasible to change the _data_list attribute directly here
        # to set the query_factory function is the right way to implement a filter.
        form.parent.query_factory = partial(Organization.children_remover, obj)
        # For root organization, allow blank
        if is_root_organization(obj):
            form.parent.allow_blank = True
            # Does not allow to change type for root organization
            delattr(form, "type")
        return form

    column_details_list = ('id', 'name', 'description', 'lft', 'rgt', 'parent',
                           'immediate_children', 'all_children')

    def after_model_change(self, form, model, is_created):
        """
        :param form: form object from the UI
        :param model: model, when on after_model_change, it has got id field and necessary default value from DB.
        :param is_created: True if model was created, False if model was updated
        :return: None
        Update left and right field of all impacted organization vai raw sql, and also update left and right
        of the newly added organization to it's parent's current right and current right + 1
        """
        from sqlalchemy import text
        from psi.app.service import Info
        db = Info.get_db()
        str_id = getattr(form, "parent").raw_data[0]
        int_id = int(
            str_id) if str_id is not None and str_id != u"__None" and len(
                str_id) > 0 else None
        parent = db.session.query(Organization).get(
            int_id) if int_id is not None else None
        if is_created:  # New create
            # update all exiting node with right and left bigger than current parent's right - 1
            if parent is not None:
                model.parent = parent
        elif parent is not None:
            # Changing parent of a subtree or leaf.
            # Refer to http://stackoverflow.com/questions/889527/move-node-in-nested-set for detail.
            lft = model.lft
            rgt = model.rgt
            parent_rgt = parent.rgt
            ts = int(rgt - lft + 1)
            # step 1: temporary "remove" moving node, change lft and right to negative integer
            # step 2: decrease left and/or right position values of currently 'lower' items (and parents)
            # step 3: increase left and/or right position values of future 'lower' items (and parents)
            # step 4: move node (ant it's subtree) and update it's parent item id
            c = parent_rgt - ts if parent_rgt > rgt else parent_rgt
            d = parent_rgt - rgt - 1 if parent_rgt > rgt else parent_rgt - rgt - 1 + ts
            sql = [
                '{u} lft = 0 - lft, rgt = 0 - rgt where lft >= {lft} and rgt <={rgt}'
                .format(u=self.uos, lft=lft, rgt=rgt),
                '{u} lft = lft - {ts} where lft > {rgt}'.format(u=self.uos,
                                                                ts=ts,
                                                                rgt=rgt),
                '{u} rgt = rgt - {ts} where rgt > {rgt}'.format(u=self.uos,
                                                                ts=ts,
                                                                rgt=rgt),
                '{u} lft = lft + {ts} where lft >= {c}'.format(ts=ts,
                                                               c=c,
                                                               u=self.uos),
                '{u} rgt = rgt + {ts} where rgt >= {c}'.format(ts=ts,
                                                               c=c,
                                                               u=self.uos),
                '{u} lft = 0-lft+{d}, rgt = 0-rgt + {d} where lft <= 0-{lft} and rgt >= 0-{rgt}'
                .format(d=d, lft=lft, rgt=rgt, u=self.uos)
            ]
            for s in sql:
                db.engine.execute(text(s))
            db.session.commit()

    def on_model_change(self, form, model, is_created):
        """Check whether the parent organization or child organization is same as the value being edited"""
        super(OrganizationAdmin, self).on_model_change(form, model, is_created)
        if (not is_root_organization(model)) and (
                getattr(form, "parent") is None
                or getattr(form, "parent")._data is None):
            raise ValidationError(
                gettext(
                    'Please specify parent organization(creation of top level organization not allowed)'
                ))
        CycleReferenceValidator.validate(form,
                                         model,
                                         object_type='Organization',
                                         parent='parent',
                                         children='all_children',
                                         is_created=is_created)

    def on_model_delete(self, model):
        """
        Validate model with child organization should not be deleted
        :param model: The model to delete
        :return: None
        """
        if len(model.all_children) > 0:
            raise ValidationError(
                gettext(
                    'Can not delete an organization with child organisation exists'
                ))

    def after_model_delete(self, model):
        """
        Adjust left and right value for organizations in DB after deleting the model.
        :param model: Model to delete
        :return: None
        """
        from sqlalchemy import text
        from psi.app.service import Info
        db = Info.get_db()
        width = model.rgt - model.lft + 1
        sql = text(
            "{u} rgt = rgt-{w} WHERE rgt > {rgt};{u} lft = lft-{w} WHERE lft > {lft}"
            .format(rgt=model.rgt, lft=model.lft, w=width, u=self.uos))
        db.engine.execute(sql)
        db.session.commit()