if not PrefixAdapter(self.context).is_valid_number(value): raise schema.interfaces.ConstraintNotSatisfied() else: parent = aq_parent(aq_inner(self.context)) if not PrefixAdapter(parent).is_valid_number(value, self.context): raise schema.interfaces.ConstraintNotSatisfied() validator.WidgetValidatorDiscriminators( ReferenceNumberPrefixValidator, field=IReferenceNumberPrefix['reference_number_prefix'], ) ReferenceNumberPrefixErrorMessage = error.ErrorViewMessage( _('error_sibling_reference_number_existing', default=u'A Sibling with the same reference number is existing.'), error=schema.interfaces.ConstraintNotSatisfied, field=IReferenceNumberPrefix['reference_number_prefix'], ) class IReferenceNumberPrefixMarker(Interface): """ Marker Interface for the ReferenceNumber-Prefix Behavior """ def saveReferenceNumberPrefix(obj, event): """When an object providing IReferenceNumberPrefixMarker (repository folders) gets added or has been modified, make sure it has a unique reference number prefix.
class NovaBoaPratica(ProcessFiles, form.SchemaForm): label = u"Inscrição de Boas Práticas" grok.context(Interface) grok.require('zope2.View') grok.name('nova-boa-pratica') ignoreContext = True # enableCSRFProtection = True schema = IBoaPraticaForm # fields = field.Fields(IBoaPraticaForm) # fields['sitesrelacionados'].widgetFactory = DataGridFieldFactory # # fields['Subject'].widgetFactory = KeywordFieldWidget <- ignorar # fields['esfera'].widgetFactory = RadioFieldWidget def update(self): #Cria toda a hieraquia das Boas Praticas self.createBoaPraticaStructure() self.request.set('disable_border', True) return super(NovaBoaPratica, self).update() @button.buttonAndHandler(u"Voltar") def handleCancel(self, action): """User cancelled. Redirect back to the front page. """ @button.buttonAndHandler(u'Enviar') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return # if action.form.widgets.errors: # self.status = self.formErrorsMessage # return if data['anexo'].contentType == 'application/msword' or data[ 'anexo'].contentType == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': messages = IStatusMessage(self.request) messages.add(u"Não é permitido efetuar o upload de arquivos Word.", type=u"error") return self.request.response.redirect(self.request.getURL()) context = self.context # tool para criacao do conteudo # pt = getToolByName(context, 'portal_types') folder_observatorio = getattr(context, 'observatorio', None) folder_boas_praticas = getattr(folder_observatorio, 'boas-praticas', None) title = data['title'] esfera = data['esfera'] uf = data['uf'] orgparticipantes = data['orgparticipantes'] description = data['description'] # Subject = data['Subject'] sitesrelacionados = data['sitesrelacionados'] # categoria = data['categoria'] id = self.generateIdForContext(folder_boas_praticas, idnormalizer.normalize(title)) boapratica = self.createObjectInContext(id, folder_boas_praticas, 'BoaPratica') boapratica.setTitle(title) boapratica.setEsfera(esfera) boapratica.setUf(uf) boapratica.setOrgparticipantes(orgparticipantes) boapratica.setDescription(description) # boapratica.setCategoria(categoria) # if Subject: # boapratica.setSubject(Subject) sitesrelacionados = [ site for site in sitesrelacionados if isinstance(site, dict) and site.get('url', None) ] sitesrelacionados = fix_sitesrelacionados_dict(sitesrelacionados) boapratica.setSitesrelacionados(sitesrelacionados) anexo_obj = data.get('anexo', None) if anexo_obj: file = data["anexo"] # folder_attach = getattr(folder_boas_praticas, 'anexo-de-praticas') anexo_obj = self.processFiles(file, boapratica) if anexo_obj: boapratica.setAnexos((anexo_obj)) boapratica.reindexObject() pw = getToolByName(context, "portal_workflow") try: pw.doActionFor(boapratica, "submit") pw.doActionFor(anexo_obj, "submit") except WorkflowException: #Não foi possivel enviar para revisão pass # if self.session.get("termo_aceito", False): # del self.session['termo_aceito'] # import pdb; pdb.set_trace() portal_site = api.portal.get() site_name = portal_site.getProperty('title_2') self.send_email_admin(boapratica.absolute_url(), site_name) messages = IStatusMessage(self.request) messages.add(u"Obrigado, sua boa prática foi enviada para aprovação.", type=u"info") self.request.response.redirect(boapratica.absolute_url()) def send_email_admin(self, link, title): """enviar um email para o admin""" message = """Há uma nova prática para análise de aprovação. \n clique no link para visualizar a boa prática \n %s """ % (link) address = self.get_adm_observatorio() subject = 'Existe nova prática pendente de avaliação no Observatório do %s ' % ( title) return simple_send_mail(message, address, subject) def get_adm_observatorio(self): # Pega o usuário administrador do fale conosco. registry = getUtility(IRegistry) adm_observatorio = registry.records[ 'mpdg.govbr.observatorio.controlpanel.IObservatorio_email.adm_observatorio'].value return adm_observatorio # traz o texto do termo de uso ### Obs : O metodo foi comentado , descomentei pois não tinha acesso no boa pratica. def getTermo(self): portal = api.portal.get() sobre = getattr(portal, 'sobre') observatorio = getattr(sobre, 'observatorio') termo = getattr(observatorio, 'termo-de-uso', None) return termo def createBoaPraticaStructure(self): """ Cria toda a arquitetura das boas praticas: Pasta - Observatorio Página - Termo de Uso Pasta - Praticas Pasta - Anexos das Boas Praticas """ portal_membership = getToolByName(self.context, "portal_membership") user_admin = portal_membership.getMemberById('admin') # stash the existing security manager so we can restore it old_security_manager = getSecurityManager() # create a new context, as the owner of the folder newSecurityManager(self.request, user_admin) folder_observatorio = getattr(self.context, 'observatorio', False) if not folder_observatorio: folder_observatorio = self.createObjectInContext( 'observatorio', self.context, 'Folder') folder_observatorio.setTitle('Observatório') try: self.context.portal_workflow.doActionFor( folder_observatorio, 'publish') except WorkflowException: pass if folder_observatorio: folder_boas_praticas = getattr(folder_observatorio, 'boas-praticas', False) document_termo_uso = getattr(folder_observatorio, 'termo-de-uso', False) if not folder_boas_praticas: folder_boas_praticas = self.createObjectInContext( 'boas-praticas', folder_observatorio, 'Folder') folder_boas_praticas.setTitle('Boas Práticas') try: folder_observatorio.portal_workflow.doActionFor( folder_boas_praticas, 'publish') except WorkflowException: pass if not document_termo_uso: document_termo_uso = self.createObjectInContext( 'termo-de-uso', folder_observatorio, 'Document') document_termo_uso.setTitle('Termo de Uso') try: folder_observatorio.portal_workflow.doActionFor( document_termo_uso, 'publish') except WorkflowException: pass # Legado. Removido na história 30718, sprint 5 (Out/16) # if folder_boas_praticas: # folder_attach = getattr(folder_boas_praticas, 'anexo-de-praticas', False) # if not folder_attach: # folder_attach = self.createObjectInContext('anexo-de-praticas', folder_boas_praticas, 'Folder') # folder_attach.setTitle('Anexo de Práticas') # folder_attach.reindexObject() # try: # folder_boas_praticas.portal_workflow.doActionFor(folder_attach, 'publish') # except WorkflowException: # pass # restore the original context setSecurityManager(old_security_manager) def createObjectInContext(self, id, context, portal_type): """ Cria uma pasta com o id passa em um contexto definido @param id: Id do conteúdo a ser criado @param context: Contexto onde será criado o conteúdo @param portal_type: Tipo de conteúdo que será criado @return: Objeto plone criado """ portal = getUtility(ISiteRoot) ptypes = getToolByName(portal, 'portal_types') new_content = ptypes.getTypeInfo(portal_type) new_content = new_content._constructInstance(context, id) new_content.reindexObject() return new_content # TODO: manual translation of error messages... RequiredMissingErrorMessage = error.ErrorViewMessage( u'Esse campo é obrigatório', error=RequiredMissing) provideAdapter(RequiredMissingErrorMessage, name='message') @form.error_message(field=IBoaPraticaForm['anexo'], error=RequiredMissing) def anexoRequiredErrorMessage(value): return u'Campo Anexo é obrigatório. Favor inserir pelo menos um arquivo.'