#summary Principais tecnologias do projeto apresentadas com trechos de código para ilustrar as implementações realizadas. #labels Phase-Implementation = Python = A codificação deste projeto utiliza essa linguagem pois é a linguagem mais legal que os desenvolvedores conhecem, por ser a linguagem mais fácil de fazer um Hello Word (print "Hello Word") e também por ser a linguagem do framework Django, escolhido por facilitar a gestão das fontes e prover uma excelente arquitetura para sistemas web. Além disso, esta adoção facilitará a integração do sistema desenvolvido com os em desenvolvimento no Interlegis (principal colaborador deste projeto). Todos os logs do sistema são feito através do módulo nativo Python chamado _logging_, módulo configurável por meio do arquivo logger.conf. Os níveis de criticidade dos logs são determinados no momento de armazenar um registro de log. Por exemplo: {{{ import logging log = logging.getLogger('metabus') log.error('Message here!') }}} {{{ 2008-10-21 11:11:30 [5854] ERROR Message here! }}} = Django = Django é o framework Python adotado como base para o desenvolvimento do Metabus. Este software além proporcionar recursos para um desenvolvimento ágil de aplicações Web, ainda sugere uma organização elegante do código fonte. A separação de interesses sugerida nesse framework possui uma nomenclatura sutilmente diferente da nomenclatura comumente adotada por vários frameworks de aplicações Web. Ao invés do conhecido MVC (Model View and Controller) utiliza-se MTV (Model Template and View) assim o elemento 'View' do MVC chama-se 'Template' no MTV e o 'Controller' do MVC chama-se 'View' no MTV. == Processamento de requisições Web == As requisições Web são mapeadas para uma 'View' através do arquivo urls.py. Nesse arquivo podemos configurar expressões regulares que identificam cada uma das urls e associam a uma determinada função de callback (View). O código abaixo é um trecho do arquivo urls.py do módulo Interface Gráfica do Metabus e ilustra como é feita a associação de uma URL de requisição Web a uma _View_: {{{ from django.conf.urls.defaults import * urlpatterns = patterns('', url (r'^$', 'metabus.ui.views.home', name='home'), url (r'^search/$', 'metabus.ui.views.search', name='search'), ) }}} Com esse código é feita a associação da url http://metabus.aquarela3.com.br/search/ para a View metabus.ui.views.search e da http://metabus.aquarela3.com.br (raiz do site) para metabus.ui.views.home. Esta função será a responsável por processar o dados necessários para montar a resposta á requisição. == Camada para acesso aos dados == O Django oferece um conjunto de classes para acesso e manipulação dos dados contidos na base de dados. Esta camada é responsável também por tornar o sistema independente do Sistema de Gerenciamento de Banco de Bados - SGBD, desta forma, pode ser utilizado qualquer banco do dados que seja suportado pelo Django (Postgres, MySQL, SQLite3 e Oracle) e as tarefas de conexão, criação das tabelas, obtenção de dados, inserções e alterações são todas efetuadas através dessa camada de um maneira única independente do SGBD utilizado. Abaixo segue um trecho do arquivo models.py onde são definidas as entidade relacionadas com as fontes de busca: {{{ class Parser(models.Model): LANGUAGES = ( ('xslt', 'XSLT'), ) name = models.CharField(_('Name'), help_text=_('Name of parser'), max_length=250) description = models.TextField(_('Description'), help_text=_('Parser description and documentation'), max_length=1024, blank=True) language = models.CharField(_('Language'), help_text=_('Parser file language'), max_length=250, choices=LANGUAGES, default='xslt') file = models.FileField(_('File'), help_text=_('Parser file'), upload_to = 'parser/%Y/%M') class Group(models.Model): name = models.CharField(_('Name'), help_text=_('Group name'), max_length=250) parent = models.ForeignKey('self', help_text=_('Parent group'), null=True, blank=True) class Source(models.Model): name = models.CharField(_('Name'), help_text=_('Name of search engine'), max_length=250) url = models.CharField(_('Search URL'), help_text=_('URL of search engine'), unique=True, max_length=250) is_rss = models.BooleanField(_('Is RSS'), help_text=_('Mark it if the search engine return RSS data'), default=True) op_and = models.CharField(_('AND'), help_text=_('AND operator string to this search'), max_length=250, default='AND') op_or = models.CharField(_('OR'), help_text=_('OR operator string to this search'), max_length=250, default='OR') cache_expires = models.IntegerField(_('Cache expires'), help_text=_('Seconds time to exipires cache results'), default=60*60*24) # Default one day parser = models.ForeignKey(Parser, help_text=_('Parser file to transform the response in RSS'), null=True, blank=True) group = models.ManyToManyField(Group, help_text=_('Group of this source'), null=True, blank=True) }}} Com código acima o Django provê a criação de tabelas, e o total controle sobre os dados. ===Estrutura de templates=== Os templates do Django tem como principal objetivo gerar um arquivo baseado em texto formatado, por exemplo HTML. Os arquivos de template contêm variáveis, quando o template é processado essas variáveis são substituídas por valores. Além de variáveis os arquivos contêm tags que controlam a lógica do template. A estrutura de templates pode ser organizada com herança de arquivos, que possibilita criar templates base com as definições de elementos comuns a todos os documentos do site, assim como blocos que permitem que outros arquivos sobrescrevam o seu conteúdo como pode ser observado no template base do metabus, apresentado no código abaixo: {{{
{# Block title should be overwrite #}