def registration_processes(self,context,user,manage=False,delete=False):
        campos = {}
        lista_itens = {}

        if not isinstance(context, dict):
            if not context:
                context = getSite()
            form = context.request # var tipo 'dict' que guarda todas as informacoes do formulario (keys,items,values)
            form_keys = form.keys() # var tipo 'list' que guarda todas as chaves do formulario (keys)
        else:
            form = context
            form['name'] = form.get('fullname', form.get('username', None))
            form['form.submited'] = ['Submited']
            form_keys = form.keys()

        user_id = self.Convert_utf8(user)
#        id_instance = 0

#        if user_id:
#            user_instance = ModelsInstanceFuncdetails().get_InstanceFuncdetails(user_id)
#            if not user_instance:
#                id_instance = ModelsInstanceFuncdetails().set_InstanceFuncdetails(user_id)
#            else:
#                id_instance = user_instance.id

        fields = ModelsConfgMyvindula().get_configurationAll()
        if fields:
            for field in fields:
                M={}
                M['required'] = field.required
                M['type'] = field.type
                M['label'] = field.label
                M['decription'] = field.decription
                M['ordem'] = field.order_position
                M['mascara'] = field.mask

                if  field.type == 'img':
                    M['instance_id'] = user_id

                campos[field.name] = M

                if field.type == 'choice' or\
                   field.type == 'list':

                    items = field.choices.splitlines()
                    valores=[]

                    # TODO: Otimizar este codigo, podemos dizer que estah muito lento e incorreto.
                    for i in items:
                        if i == "###unidadesorganizacionais###":
                            unidades = self.get_unidade_organizacional_text()
                            for unidade in unidades:
                                valores.append([unidade[0],unidade[1]])
                        else:
                            valores.append([i, i])

                    lista_itens[field.name] = valores

        conf = {}
        for item in campos.keys():
            try: conf[item] = ModelsConfgMyvindula().getConfig_edit(item)
            except:conf[item] = True

        # divisao dos dicionarios "errors" e "convertidos"
        form_data = {
            'errors': {},
            'data': {},
            'campos':campos,
            'lista_itens':lista_itens,

            'departametos': ModelsDepartment().get_department(),
            'username' : user_id,
            'config_myvindula':conf,
            'manage':manage,}

        # se clicou no botao "Voltar"
        if 'form.voltar' in form_keys:
            if 'id_instance' in form_keys and isForm:
                context.request.response.redirect(success_url+'/view-form')
            else:
                context.request.response.redirect(getSite().portal_url() + '/@@usergroup-userprefs')

        # se clicou no botao "Salvar"
        elif 'form.submited' in form_keys:
            if not user_id:
                campos['username'] = {'required': True, 'type' : self.to_utf8, 'label':''}

            #Remove o campos departamento da validação
            if 'vin_myvindula_department' in campos.keys():
                campos.pop('vin_myvindula_department')

            #Remove o campos img da validação
            camposAux = copy(campos)
            for item in camposAux:
                D = camposAux[item]
                if D.get('type') == 'img':
                    campos.pop(item)

            # Inicia o processamento do formulario
            # chama a funcao que valida os dados extraidos do formulario (valida_form)
            if not isinstance(context, dict):
                form = context.request.form
            else:
                form = context

            errors, data = valida_form_dinamic(context, campos, form)

            if not errors:
#                if not user_id:
#                    id_instance = ModelsInstanceFuncdetails().set_InstanceFuncdetails(data.get('username'))
#                    user_id = data.get('username')
#                    data.pop('username')

                if 'vin_myvindula_department' in form_keys or 'departaments_old' in form_keys:
                    L = []
                    ModelsDepartment().del_department(user_id)

                    portalGroup = getSite().portal_groups
                    portalCatalog = getSite().portal_catalog

                    if form.get('vin_myvindula_department', None):
                        if not type(form.get('vin_myvindula_department', None)) == list:
                            L.append(form.get('vin_myvindula_department', None))
                        else:
                            L = form.get('vin_myvindula_department', None)
                    deparataments_old = form.get('departaments_old', [])

                    #Adiciona o usuario do grupo da estrutura organizacional
                    dep_adicionados = set(L) - set(deparataments_old)
                    for departament in dep_adicionados:
                        D={}
                        D['UID'] = unicode(departament,'utf-8')
                        D['funcdetails_id'] = user_id
                        ModelsDepartment().set_department(**D)

                        obj_org = portalCatalog(portal_type='OrganizationalStructure', UID=departament)
                        if obj_org:
                            obj_org = obj_org[0].getObject()

                            #Adiciona o usuário no campo Employees
                            if user_id not in obj_org.getEmployees():
                                tuple_employees = list(obj_org.employees)
                                tuple_employees.append(user_id)
                                obj_org.employees = tuple(tuple_employees)

                            #Adiciona o usuário no campo Permissao de Visualizacao
                            if user_id not in obj_org.getGroups_view():
                                tuple_Groups_view = list(obj_org.Groups_view)
                                tuple_Groups_view.append(user_id)
                                obj_org.Groups_view = tuple(tuple_Groups_view)

                        if user_id not in portalGroup.getGroupById(departament+'-view').getAllGroupMemberIds():
                            portalGroup.getGroupById(departament+'-view').addMember(user_id)

                    #Exclui o usuario do grupo da estrutura organizacional
                    dep_excluidos = set(deparataments_old) - set(L)
                    for departament in dep_excluidos:
                        ModelsDepartment().del_department(user=unicode(user_id), depUID=unicode(departament,'utf-8'))

                        obj_org = portalCatalog(portal_type='OrganizationalStructure', UID=departament)
                        if obj_org:
                            obj_org = obj_org[0].getObject()
                            if user_id != obj_org.getManager():
                                #Removendo o usuário no campo Employees
                                if user_id in obj_org.getEmployees():
                                    tuple_employees = list(obj_org.employees)
                                    tuple_employees.remove(user_id)
                                    obj_org.employees = tuple(tuple_employees)

                                #Removendo o usuário no campo Permissao de Visualizacao
                                if user_id in obj_org.getGroups_view():
                                    tuple_Groups_view = list(obj_org.Groups_view)
                                    tuple_Groups_view.remove(user_id)
                                    obj_org.Groups_view = tuple(tuple_Groups_view)

                                if user_id in portalGroup.getGroupById(departament+'-view').getAllGroupMemberIds():
                                    portalGroup.getGroupById(departament+'-view').removeMember(user_id)

                            else:
                                self.setStatusMessage("error","O usuário é gestor do departamento %s, ele não pode ser removido." % obj_org.Title())
                                self.setRedirectPage('/@@user-information?userid='+user_id)
                                form_data['errors'] = errors
                                form_data['data'] = data
                                return form_data

                for item in data.keys():
                    field_name = self.Convert_utf8(item)
                    valor = data[item]
                    result_campo = ModelsDadosFuncdetails().get_DadosFuncdetails_byInstanceAndFieldName(user_id,field_name)
                    if result_campo:
                        result_campo.value = valor.strip()
                        result_campo.date_modified = datetime.now()
                        self.db.store.commit()
                    else:
                        if valor:
                            D={}
                            #D['vin_myvindula_instance_id'] = id_instance
                            D['username'] = user_id
                            D['field'] = field_name
                            D['value'] = self.Convert_utf8(valor)
                            ModelsDadosFuncdetails().set_DadosFuncdetails(**D)

                #Redirect back to the front page with a status message
                self.setStatusMessage("info","Perfil editado com sucesso.")
                if manage:
                    self.setRedirectPage('/@@usergroup-userprefs')
                else:
                    self.setRedirectPage('/myvindulalistuser')

            else:
                form_data['errors'] = errors
                form_data['data'] = data
                return form_data

        # se for um formulario de edicao
        elif user_id:# and id_instance:

            #data_value = ModelsInstanceFuncdetails().get_InstanceDadosFuncdetails(user_id)

            data_value = self.get_prefs_user(user_id)
#            D = {}
#            if data_value:
#                for campo in campos.keys():
#                    for data in data_value:
#                        if data.vin_myvindula_confgfuncdetails_fields == campo:
#                            D[campo] = data.valor

            data_value['vin_myvindula_department'] = ModelsDepartment().get_departmentByUsername(user_id)
            form_data['data'] = data_value

            return form_data

        else:
            return form_data
    def configuration_processes(self,context):
        form = context.request # var tipo 'dict' que guarda todas as informacoes do formulario (keys,items,values)
        form_keys = form.keys() # var tipo 'list' que guarda todas as chaves do formulario (keys)

        campos = {'name'     : {'required': True,  'type':'key',          'label':'Nome do Campo',               'decription':'Nome unico do campo',                                                   'ordem':0},
                  'ativo_edit' : {'required': False, 'type':'bool',         'label':'Habilitado para edição',      'decription':'Habilita a edição do campo pelo funcionário',                           'ordem':1},
                  'ativo_view' : {'required': False, 'type':'bool',         'label':'Habilitado para visualização','decription':'Habilita a visualização do campo pelo funcionário',                     'ordem':2},
                  'label'      : {'required': True,  'type':self.to_utf8,   'label':'Título',                      'decription':'Digite o nome de visualização do campo pelo funcionário',               'ordem':3},
                  'decription' : {'required': False, 'type':'textarea',     'label':'Descrição',                   'decription':'Descrição para o preenchimento do campo',                                'ordem':4},
                  'required'   : {'required': False, 'type':'bool',         'label':'Campo Obrigatório',           'decription':'Este campo sera de preenchimento obrigátorio',                           'ordem':5},
                  'type'       : {'required': True,  'type':'choice',       'label':'Tipo do Campo',               'decription':'Escolha o tipo do campo ',                                              'ordem':6},
                  'choices'    : {'required': False, 'type':'textarea',     'label':'Lista de dados para o select','decription':u'Caso o campo seja um select ou list digite os valores para o campo\
                                                                                                                                  <br /> Digite um item por linha',                                      'ordem':7},
                  'mask'    : {'required': False, 'type':'choice',       'label':'Tipo da Máscara',             'decription':'Escolha um tipo de máscara para o campo ',                              'ordem':8},
                  'profile_category' : {'required': True,  'type':'choice',       'label':'Área de Visualização',        'decription':'Escolha um área para este campo ser visualizado no perfil do usúario',  'ordem':9},
                  'order_position'      : {'required': False, 'type':'hidden',       'label':'Ordenação',                   'decription':'',                                                                      'ordem':10},
                  }

        lista_itens = {'type':[['text','Campo de Texto'],['textarea','Campo Texto Múltiplas Linhas'],
                               ['img','Campo de Upload de Imagem'], ['list','Campo de Seleção Multipla'],
                               ['choice','Campo de Escolha']],

                       'mask':[['Telefone','Telefone'],['Data','Data'],['Integer','Números Inteiros'],
                                  ['Cpf','CPF'],['Cep','CEP'],['Cnpj','CNPJ']],

                       'profile_category':[['personal','Pessoal'],['contact','Contato'],
                                       ['corporate','Corporativo'],['other','Outros']
                                       ]
                       }

        site = context.context.portal_url.getPortalObject()
        pw = site.portal_workflow
        if 'control-panel-objects' in  site.keys():
            control = site['control-panel-objects']
            if 'fieldset-myvindula' in control.keys():
                folder_Areas = control['fieldset-myvindula']
                for item in folder_Areas.objectValues():

                    if pw.getInfoFor(item,'review_state') == 'published':
                        lista_itens['profile_category'].append([item.getId(),item.Title()])

        result_form = ModelsConfgMyvindula().get_configurationAll()

        # divisao dos dicionarios "errors" e "convertidos"
        form_data = {
            'errors': {},
            'data': {},
            'campos':campos,
            'lista_itens':lista_itens}

        # se clicou no botao "Voltar"
        if 'form.voltar' in form_keys:

            self.setRedirectPage('/myvindulaconfgs')

        # se clicou no botao "Salvar"
        elif 'form.submited' in form_keys:
            # Inicia o processamento do formulario
            # chama a funcao que valida os dados extraidos do formulario (valida_form)
            errors, data = valida_form_dinamic(context, campos, context.request.form)

            if not errors:
                if 'name' in form_keys and 'form.edit' in form_keys:
                    # editando...
                    fields = form.get('name','')
                    result_fields = ModelsConfgMyvindula().get_configuration_By_fields(fields)
                    if result_fields:
                        for campo in campos.keys():
                            value = data.get(campo, None)
                            setattr(result_fields, campo, value)

                        self.setStatusMessage("info","Campo editado com com sucesso")
                        self.setRedirectPage('/myvindulaconfgs')

                else:
                    if ModelsConfgMyvindula().check_fields(data['name']):
                        #adicionando...
                        ModelsConfgMyvindula().set_configuration(**data)
                        self.setStatusMessage("info","Campo adicionado com sucesso")
                        self.setRedirectPage('/myvindulaconfgs')

                    else:
                        self.setStatusMessage("error","Já existe um campo com este nome")
                        self.setRedirectPage('/edit_myvindulaconfgs')

            else:
                form_data['errors'] = errors
                form_data['data'] = data
                return form_data

        # se clicou em excluir
        elif 'form.excluir' in form_keys:
            field = self.Convert_utf8(form.get('fields',''))
            ModelsConfgMyvindula().del_configuration(field)

            self.setStatusMessage("info","Campo removido com sucesso")
            self.setRedirectPage('/myvindulaconfgs')

        # se for um formulario de edicao
        elif 'fields' in form_keys: #'forms_id'in form_keys and :
            fields = form.get('fields','')
            if fields in context.BlackList:
                campos['name']['type'] = 'hidden'
                campos['type']['type'] = 'hidden'
                campos['profile_category']['type'] = 'hidden'

            data = ModelsConfgMyvindula().get_configuration_By_fields(fields)
           # campos['name_field'] = {'required': True,  'type':'hidden','label':'Nome do Campo', 'decription':u'', 'ordem':0}
            if data:
                D = {}
                for campo in campos.keys():
                    D[campo] = getattr(data, campo, '')

                form_data['data'] = D
                return form_data
            else:
               return form_data

        #se for um formulario de adição
        else:
            data = {}

            if result_form:
                data['order_position'] = result_form.count()
            else:
                 data['order_position'] = 0
            form_data['data'] = data
            return form_data