class LoginForm(FlaskForm): username = StringField(l_('Username'), validators=[InputRequired()]) password = PasswordField(l_('Password'), validators=[InputRequired()]) language = SelectField(l_('Language')) submit = SubmitField(l_('Login')) def validate(self): super().validate() try: auth_client = get_auth_client(self.username.data, self.password.data) response = auth_client.token.new('xivo_admin', expiration=60 * 60 * 12) except HTTPError as e: if unauthorized(e): self.username.errors.append(USERNAME_PASSWORD_ERROR) self.password.errors.append(USERNAME_PASSWORD_ERROR) return False raise ValidationError( l_('Error with Wazo authentication server: %(error)s', error=e.message)) except requests.ConnectionError: raise ValidationError( l_('Wazo authentication server connection error')) self.user = UserUI(response['token'], response['auth_id']) return True
class TransferServicesFuncKeyDestinationForm(BaseForm): select_field = 'transfer' transfer = SelectField(l_('Transfer'), choices=[ ('blind', l_('Blind transfer')), ('attended', l_('Indirect transfer')) ], validators=[InputRequired()])
class LoginForm(FlaskForm): username = StringField(l_('Username'), validators=[InputRequired()]) password = PasswordField(l_('Password'), validators=[InputRequired()]) language = SelectField(l_('Language')) submit = SubmitField(l_('Login'), render_kw={'data-loading-text': "<i class='fa fa-circle-o-notch fa-spin'></i> Processing..."}) def validate(self): super().validate() try: auth_client = AuthClient( username=self.username.data, password=self.password.data, **app.config['auth'], ) response = auth_client.token.new(expiration=60 * 60 * 12) auth_client.set_token(response['token']) user = auth_client.users.get(response['metadata']['uuid']) user['password'] = self.password.data user['instance_uuid'] = response['xivo_uuid'] session['user'] = user except HTTPError as e: if unauthorized(e): self.username.errors.append(USERNAME_PASSWORD_ERROR) self.password.errors.append(USERNAME_PASSWORD_ERROR) return False raise ValidationError(l_('Error with Wazo authentication server: %(error)s', error=e.message)) except requests.ConnectionError: raise ValidationError(l_('Wazo authentication server connection error')) self.user = UserUI(response['token'], response['auth_id']) self.user.set_tenant(response['metadata']['tenant_uuid']) return True
class FuncKeyTemplateKeysForm(BaseForm): id = HiddenField() label = StringField(l_('Label'), [Length(max=128)]) digit = IntegerField(validators=[InputRequired()]) destination = FuncKeyDestinationField() blf = BooleanField(l_('BLF'), default=False) submit = SubmitField()
class MembersForm(BaseForm): user_uuids = SelectMultipleField(l_('Members'), choices=[]) users = FieldList(FormField(UserUuidForm)) group_uuids = SelectMultipleField(l_('Groups'), choices=[]) groups = FieldList(FormField(GroupUuidForm)) policy_uuids = SelectMultipleField(l_('Policies'), choices=[]) policies = FieldList(FormField(PolicyUuidForm))
def validate(self): super().validate() try: auth_client = AuthClient( username=self.username.data, password=self.password.data, **app.config['auth'], ) response = auth_client.token.new(expiration=60 * 60 * 12) auth_client.set_token(response['token']) user = auth_client.users.get(response['metadata']['uuid']) user['password'] = self.password.data user['instance_uuid'] = response['xivo_uuid'] session['user'] = user except HTTPError as e: if unauthorized(e): self.username.errors.append(USERNAME_PASSWORD_ERROR) self.password.errors.append(USERNAME_PASSWORD_ERROR) return False raise ValidationError(l_('Error with Wazo authentication server: %(error)s', error=e.message)) except requests.ConnectionError: raise ValidationError(l_('Wazo authentication server connection error')) self.user = UserUI(response['token'], response['auth_id']) self.user.set_tenant(response['metadata']['tenant_uuid']) return True
class NetworkConfigurationForm(BaseForm): provision_host = StringField(l_('Provisioning host')) provision_http_port = IntegerField(l_('Provisioning port'), validators=[Regexp('^[0-9]+$')]) rest_host = StringField(l_('REST API host')) rest_https_port = IntegerField(l_('REST API HTTPS port'), validators=[Regexp('^[0-9]+$')])
class PolicyForm(BaseForm): name = StringField(l_('Name'), validators=[InputRequired]) description = StringField(l_('Description')) acl_templates = FieldList(FormField(AclTemplatesForm)) tenant_uuid = SelectField(l_('Tenant'), choices=[]) tenant = FormField(TenantUuidForm) submit = SubmitField()
class ScheduleForm(BaseForm): name = StringField(l_('Name'), validators=[InputRequired()]) timezone = SelectField(l_('Timezone'), choices=list_timezones()) closed_destination = DestinationField() exceptional_periods = FieldList(FormField(ScheduleExceptionalPeriodForm)) open_periods = FieldList(FormField(ScheduleOpenPeriodForm)) submit = SubmitField(l_('Submit'))
class ExtensionView(BaseIPBXHelperView): form = ExtensionForm resource = 'extension' @menu_item('.ipbx.advanced', l_('Advanced'), order=999, icon="gears", multi_tenant=True) @menu_item('.ipbx.advanced.extensions', l_('Extensions'), order=1, icon="tty", multi_tenant=True) def index(self): return super().index() def _populate_form(self, form): form.context.choices = self._build_set_choices_context(form) return form def _build_set_choices_context(self, extension): if not extension.context.data or extension.context.data == 'None': return [] return [(extension.context.data, extension.context.data)]
class LineForm(BaseForm): context = SelectField(l_('Context'), choices=[]) protocol = SelectField(choices=[('sip', l_('SIP')), ('custom', l_('CUSTOM'))]) endpoint_sip = FormField(EnpointSipForm) endpoint_custom = FormField(EnpointCustomForm) submit = SubmitField(l_('Submit'))
class UserDestinationForm(BaseForm): set_value_template = '{user_firstname} {user_lastname}' user_id = SelectField(l_('User'), choices=[], validators=[InputRequired()]) ring_time = IntegerField(l_('Ring time'), [NumberRange(min=0)]) user_firstname = DestinationHiddenField() user_lastname = DestinationHiddenField()
class ConferenceView(BaseIPBXHelperView): form = ConferenceForm resource = l_('conference') @menu_item('.ipbx.services', l_('Services'), icon="star", multi_tenant=True) @menu_item('.ipbx.services.conferences', l_('Conferences'), icon="compress", multi_tenant=True) def index(self): return super().index() def _populate_form(self, form): form.extensions[0].exten.choices = self._build_set_choices_exten( form.extensions[0]) form.extensions[0].context.choices = self._build_set_choices_context( form.extensions[0]) form.music_on_hold.choices = self._build_set_choices_moh( form.music_on_hold) return form def _build_set_choices_exten(self, extension): if not extension.exten.data or extension.exten.data == 'None': return [] return [(extension.exten.data, extension.exten.data)] def _build_set_choices_context(self, extension): if not extension.context.data or extension.context.data == 'None': context = self.service.get_first_internal_context() else: context = self.service.get_context(extension.context.data) if context: return [(context['name'], context['label'])] return [(extension.context.data, extension.context.data)] def _build_set_choices_moh(self, moh): if not moh.data or moh.data == 'None': return [] return [(moh.data, moh.data)] def _map_form_to_resources(self, form, form_id=None): resource = form.to_dict() if form_id: resource['uuid'] = form_id resource['music_on_hold'] = form.music_on_hold.data or None return resource def _map_resources_to_form_errors(self, form, resources): form.populate_errors(resources.get('conference', {})) form.extensions[0].populate_errors(resources.get('extension', {})) return form
class AccessFeatureForm(BaseForm): feature = SelectField( l_('Feature'), choices=[('phonebook', l_('Phonebook'))], validators=[InputRequired()], ) host = StringField(l_('Host')) submit = SubmitField(l_('Submit'))
class QueueDestinationForm(BaseForm): set_value_template = '{queue_label}' queue_id = SelectField(l_('Queue'), [InputRequired()], choices=[]) ring_time = IntegerField(l_('Ring Time'), [NumberRange(min=0)]) queue_label = DestinationHiddenField() skill_rule_id = SelectField(l_('Skill Rule'), description='skillrule', choices=[]) skill_rule_variables = StringField(l_('Skill Rule Variables'))
class CdrView(IndexAjaxHelperViewMixin, BaseIPBXHelperView): form = object resource = 'cdr' @menu_item('.ipbx.reporting', l_('Reporting'), icon="pie-chart") @menu_item('.ipbx.reporting.cdrs', l_('CDR'), icon="newspaper-o") def index(self): return super().index()
class CsvForm(BaseForm): first_matched_columns = FieldList(FormField(ColumnsForm)) format_columns = FieldList(FormField(ValueColumnsForm)) searched_columns = FieldList(FormField(ColumnsForm)) # `separator` can't be used an a field for wtforms ... delimiter = StringField(l_('Delimiter')) file = StringField(l_('File'), validators=[InputRequired()]) unique_column = StringField(l_('Unique column'))
class PhonebookView(BaseIPBXHelperView): form = PhonebookForm resource = 'phonebook' @menu_item('.ipbx.phonebooks', l_('Phonebooks'), icon="book", multi_tenant=True) @menu_item('.ipbx.phonebooks.config', l_('Configuration'), order=1, icon="wrench", multi_tenant=True) def index(self): return super().index()
class VoicemailZonemessages(BaseForm): name = StringField(l_('Name')) timezone = SelectField( l_('Timezone'), validators=[InputRequired()], choices=[], ) message = StringField(l_('Message'))
class ApplicationCallBackDISADestination(BaseForm): pin = StringField( l_('PIN'), [Length(max=40), Regexp(r'^[0-9]+$')], render_kw={'type': 'password'}, ) context = StringField(l_('Context'), [InputRequired(), Length(max=39), Regexp(r'^[a-zA-Z0-9_-]+$')])
class InterceptorsForm(BaseForm): user_uuids = SelectMultipleField(l_('Interceptor Users'), choices=[], default=[]) users = FieldList(FormField(UserForm)) group_ids = SelectMultipleField(l_('Interceptor Groups'), choices=[], default=[]) groups = FieldList(FormField(GroupForm))
class ConfigDeviceForm(BaseForm): id = HiddenField() X_type = StringField(default='device') parent_ids = SelectMultipleField(l_('Parent'), choices=[], default=[]) raw_config = FormField(RawConfigDeviceForm) label = StringField(l_('Label'), validators=[InputRequired(), Length(max=128)]) submit = SubmitField(l_('Submit'))
class TargetsForm(BaseForm): user_uuids = SelectMultipleField(l_('Target Users'), choices=[], default=[]) users = FieldList(FormField(UserForm)) group_ids = SelectMultipleField(l_('Target Groups'), choices=[], default=[]) groups = FieldList(FormField(GroupForm))
class CallPickupForm(BaseForm): name = StringField(l_('Name'), validators=[InputRequired(), Length(max=128)]) interceptors = FormField(InterceptorsForm) targets = FormField(TargetsForm) description = StringField(l_('Description')) enabled = BooleanField(l_('Enabled')) submit = SubmitField(l_('Submit'))
class OdooForm(BaseForm): first_matched_columns = FieldList(FormField(ColumnsForm)) format_columns = FieldList(FormField(ValueColumnsForm)) searched_columns = FieldList(FormField(ColumnsForm)) server = StringField(l_('Server')) port = StringField(l_('Port')) userid = StringField(l_('UserID')) password = StringField(l_('Password')) database = StringField(l_('Database'))
class HangupDestination(BaseDestinationForm): select_field = 'cause' cause = SelectField(l_('Cause'), choices=[('normal', l_('Normal')), ('busy', l_('Busy')), ('congestion', l_('Congestion'))]) busy = FormField(HangupBusyDestination) congestion = FormField(HangupBusyDestination) normal = FormField(HangupNormalDestination)
class VoicemailDestinationForm(BaseForm): set_value_template = '{voicemail_name}' voicemail_id = SelectField(l_('Voicemail'), [InputRequired()], choices=[]) greeting = SelectField(l_('Greeting'), choices=[('busy', l_('Busy')), ('unavailable', l_('Unavailable'))]) skip_instructions = BooleanField(l_('Skip instructions')) voicemail_name = DestinationHiddenField()
class LineForm(BaseForm): context = SelectField(l_('Context'), validators=[InputRequired()], choices=[]) protocol = SelectField(choices=[('sip', l_('SIP')), ('custom', l_('CUSTOM'))]) endpoint_sip = FormField(EndpointSIPForm) endpoint_custom = FormField(EndpointCustomForm) submit = SubmitField(l_('Submit'))
class TrunkForm(BaseForm): context = SelectField(l_('Context'), choices=[]) protocol = SelectField(choices=[('sip', l_('SIP')), ('iax', l_('IAX')), ('custom', l_('CUSTOM'))]) endpoint_sip = FormField(EnpointSipForm) endpoint_iax = FormField(EnpointIaxForm) endpoint_custom = FormField(EnpointCustomForm) register_sip = FormField(RegisterSIPForm) register_iax = FormField(RegisterIAXForm) submit = SubmitField(l_('Submit'))
class IdentityView(BaseIPBXHelperView): form = IdentityForm resource = 'identity' @menu_item('.ipbx.identity', l_('Credentials'), icon="user-secret", multi_tenant=True) @menu_item('.ipbx.identity.identities', l_('Identities'), order=1, icon="user", multi_tenant=True) def index(self): return super().index() def _map_resources_to_form(self, resource): resource['members']['group_uuids'] = [ group['uuid'] for group in resource['members']['groups'] ] resource['members']['policy_uuids'] = [ policy['uuid'] for policy in resource['members']['policies'] ] form = self.form(data=resource) return form def _populate_form(self, form): form.members.group_uuids.choices = self._build_set_choices_groups( form.members.groups) form.members.policy_uuids.choices = self._build_set_choices_policies( form.members.policies) return form def _build_set_choices_groups(self, groups): results = [] for group in groups: results.append((group.form.uuid.data, group.form.name.data)) return results def _build_set_choices_policies(self, policies): results = [] for policy in policies: results.append((policy.form.uuid.data, policy.form.name.data)) return results def _map_form_to_resources(self, form, form_id=None): resource = form.to_dict() if form_id: resource['uuid'] = form_id resource['members']['groups'] = [{ 'uuid': group_uuid } for group_uuid in form.members.group_uuids.data] resource['members']['policies'] = [{ 'uuid': policy_uuid } for policy_uuid in form.members.policy_uuids.data] return resource