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')
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())
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())
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')
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.")])
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')
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')
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())
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.')
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.')
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
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())
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)
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.')
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 })
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 })
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())
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')
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.')
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)
class FormCriarDepartamento(FormBase): nome = StringField('Nome', validators=[InputRequired(), Length(1, 64)]) centro = QuerySelectField( 'Centro', query_factory=lambda: Centro.query.order_by('nome').all())
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.' )
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.' )
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()) }
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()