from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed from wtforms import StringField, SubmitField, URLField, IntegerField, SelectField from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError import minibase.blueprints.company.utils as companyUtils import minibase.blueprints.geography.utils as geoUtils import minibase.blueprints.main.utils as mainUtils import minibase.theme as theme from wtforms_alchemy import ModelForm from minibase.blueprints.company.models import Companies from minibase.blueprints.sensor.models import nbiotDevice from minibase.blueprints.user.models import Users class companyForm(FlaskForm): # Defines the form class to be used for the user update name = StringField('Name', validators=[DataRequired(), Length(min=3, max=100)]) website = URLField('Website', validators=[DataRequired(), Length(min=3, max=100)]) country_id = SelectField('Country', validators=[DataRequired()], render_kw={"hx-get": "/geography/get_cities", "hx-target": "#city_id"}) city_id = SelectField('City', validators=[DataRequired()], render_kw={"hx-get": "/geography/get_states", "hx-target": "#state_id"}) state_id = SelectField('State', validators=[]) post_code = IntegerField('Post', validators=[DataRequired()]) street = StringField('Street', validators=[DataRequired()]) street_no = IntegerField('No', validators=[DataRequired()]) industry_id = SelectField('Industry', validators=[DataRequired()]) legal_entity_id = SelectField('Legal Entity', validators=[DataRequired()]) type_id = SelectField('Type', validators=[DataRequired()]) relation_id = SelectField('Relation', validators=[DataRequired()]) status_id = SelectField('Status', validators=[DataRequired()]) comment = StringField('Comment', validators=[DataRequired(), Length(min=3, max=400)]) image_file = FileField('Update company Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField() def populate_for_updating(self, company): self.submit.label.text = "Update" self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(company.country_id)] # This is for the htmx implementation. please be careful how of there is data we first take from the database an then from the from(containing th htmx call) if self.country_id.data: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryId(self.country_id.data)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryId(self.country_id.data)] else: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryIdWithDefault(company.city_id, company.country_id)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryIdWithDefault(company.state_id, company.country_id)] self.industry_id.choices = [(row.id, row.name) for row in mainUtils.queryIndustryNamesWithDefault(company.industry_id)] self.legal_entity_id.choices = [(row.id, row.name) for row in companyUtils.queryLegalEntityNamesWithDefault(company.legal_entity_id)] self.type_id.choices = [(row.id, row.name) for row in companyUtils.queryTypeNamesWithDefault(company.type_id)] self.relation_id.choices = [(row.id, row.name) for row in companyUtils.queryRelationNamesWithDefault(company.relation_id)] self.status_id.choices = [(row.id, row.name) for row in companyUtils.queryStatusNamesWithDefault(company.status_id)] def populate_for_adding(self, company): self.submit.label.text = "Add" del self.image_file self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNames()] # This is for the htmx implementation. please be careful how of there is data we switch the funtion needed if self.country_id.data: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryId(self.country_id.data)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryId(self.country_id.data)] else: self.city_id.choices = [] self.state_id.choices = [] self.industry_id.choices = [(row.id, row.name) for row in mainUtils.queryIndustryNames()] self.legal_entity_id.choices = [(row.id, row.name) for row in companyUtils.queryLegalEntityNames()] self.type_id.choices = [(row.id, row.name) for row in companyUtils.queryTypeNames()] self.relation_id.choices = [(row.id, row.name) for row in companyUtils.queryRelationNames()] self.status_id.choices = [(row.id, row.name) for row in companyUtils.queryStatusNames()] # Queries to be made in order to validate the form : If username exists def validate_companyName(self, company_name): company = companyUtils.queryByNameFirst(company_name) if company: raise ValidationError('That username is taken please choose another one')