Skip to content

Commit

Permalink
Merge pull request #1237 from scieloorg/beta
Browse files Browse the repository at this point in the history
Incorporação de códigos estáveis
  • Loading branch information
gustavofonseca committed Feb 1, 2016
2 parents 64894bc + 3347af0 commit 377907a
Show file tree
Hide file tree
Showing 7 changed files with 1,340 additions and 77 deletions.
90 changes: 90 additions & 0 deletions fabfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# coding: utf-8
""" Tarefas para manutenção de instalações do SciELO Manager.
Exemplo:
fab deploy:tag=v2016.01.18 --scielomanager_settings_file=/etc/scieloapps/scielomanager.py \
--installation_path=/var/www/manager_scielo_org
"""
from fabric.api import *


SCIELOMANAGER_SETTINGS_FILE = env.get('scielomanager_settings_file',
'/etc/scieloapps/scielomanager.py')
INSTALLATION_PATH = env.get('installation_path',
'/var/www/manager_scielo_org')


def get_version():
""" Obtém a versão ativa da instalação.
O formato da resposta segue a máscara:
<tag>-<total de commits além da tag>-<hash do head>
Veja https://www.git-scm.com/docs/git-describe
"""
with cd(INSTALLATION_PATH):
output = run('git describe --long --dirty --abbrev=10 --tags')
return output


def list_watchers():
""" `watcher` é uma entidade monitorada pelo Circus.
Cada `watcher` pode ser composto por 1 ou N processos.
"""
with settings(sudo_user='root', warn_only=True):
output = sudo('circusctl status | grep scielomanager')
return [line.split(':')[0] for line in output.splitlines()]


def reload_app():
""" Reinicia, com carinho, todos os `watchers` da aplicação.
"""
with settings(sudo_user='root', warn_only=True):
for watcher in list_watchers():
sudo('circusctl reload %s' % watcher)


def kill_circus():
""" Termina o Circus e todos os seus `watchers`.
Tendo em vista que o `circusd` é gerenciado pelo monitor do sistema operacional,
essa função funciona como um `reload` do tipo força-bruta e deve ser evitado
pois causa indisponibilidade da app.
"""
with settings(sudo_user='root', warn_only=True):
sudo('circusctl quit')


def deploy(tag):
""" Instala a versão `tag` da aplicação.
"""
with settings(sudo_user='root', warn_only=True):
with settings(warn_only=True):
if run('test -d {path}'.format(path=INSTALLATION_PATH)).failed:
sudo('git clone https://github.com/scieloorg/scielo_publishing_schema.git {path}'.format(
path=INSTALLATION_PATH))

with cd(INSTALLATION_PATH):
with prefix('workon scielomanager'):
sudo('git fetch origin && git checkout {tag} -b {tag}'.format(
tag=tag))
sudo('SCIELOMANAGER_SETTINGS_FILE={path} make upgrade'.format(
path=SCIELOMANAGER_SETTINGS_FILE))

reload_app()


def backup_db():
""" Realiza *dump* completo da base de dados da aplicação.
"""
pass

def restore_db(path_to_script):
""" Realiza *restore* da base de dados, com base no script SQL disponível em
`path_to_script`.
"""
pass

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

68 changes: 40 additions & 28 deletions scielomanager/journalmanager/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

from django.db import (
models,
transaction,
IntegrityError,
DatabaseError,
)
Expand Down Expand Up @@ -1256,10 +1255,30 @@ def __repr__(self):
self.link_type)


class ArticleControlAttributes(models.Model):
""" Atributos de controle de instância tipo `Article`.
"""
es_updated_at = models.DateTimeField(null=True, blank=True)
es_is_dirty = models.BooleanField(default=True)
articles_linkage_is_pending = models.BooleanField(default=False)

article = models.OneToOneField('Article', on_delete=models.CASCADE,
related_name='control_attributes')

def __repr__(self):
return '<%s article="%s" es_updated_at="%s" es_is_dirty="%s" articles_linkage_is_pending="%s">' % (
self.__class__.__name__, repr(self.article), self.es_updated_at,
self.es_is_dirty, self.articles_linkage_is_pending)


class Article(models.Model):
"""
Artigo associado ou não a um periódico ou fascículo.
Atributos de controle -- integração com Elasticsearch e referenciamento
recursivo -- podem ser acessador por meio do atributo `control_attributes`,
duh.
Obs:
Na versão 1.8 do Django, tem incorporado um novo tipo de campo no core: UUIDField, que seria
a solucão ideal para o campo ``aid``, incluido otimização no banco de dados.
Expand All @@ -1272,13 +1291,11 @@ class Article(models.Model):

created_at = models.DateTimeField(auto_now_add=True, default=datetime.datetime.now)
updated_at = models.DateTimeField(auto_now=True, default=datetime.datetime.now)
es_updated_at = models.DateTimeField(null=True, blank=True) # elasticsearch
es_is_dirty = models.BooleanField(default=True)
articles_linkage_is_pending = models.BooleanField(default=False)

aid = models.CharField(max_length=32, unique=True, editable=False)
doi = models.CharField(max_length=2048, default=u'', db_index=True)
domain_key = models.SlugField(max_length=2048, unique=True, db_index=False, editable=False)
domain_key = models.SlugField(max_length=2048, unique=True, db_index=False,
editable=False)
is_visible = models.BooleanField(default=True)
is_aop = models.BooleanField(default=False)
xml = XMLSPSField()
Expand Down Expand Up @@ -1338,7 +1355,7 @@ def save(self, *args, **kwargs):
self.is_aop = self._get_is_aop()
self.domain_key = self._get_domain_key()

if not self.pk:
if self.pk is None:
self.journal_title = self.get_value(self.XPaths.JOURNAL_TITLE)
self.issn_ppub = self.get_value(self.XPaths.ISSN_PPUB) or ''
self.issn_epub = self.get_value(self.XPaths.ISSN_EPUB) or ''
Expand All @@ -1356,17 +1373,8 @@ def save(self, *args, **kwargs):
if not self.article_type:
raise ValueError('Could not get article-type from %s' % self)

if self.article_type in LINKABLE_ARTICLE_TYPES:
self.articles_linkage_is_pending = True

super(Article, self).save(*args, **kwargs)

def save_dirty(self, *args, **kwargs):
""" Salva a instância marcando-a como pendente de indexação no
Elasticsearch.
"""
self.es_is_dirty = True
self.save(*args, **kwargs)

def get_value(self, expression):
""" Busca `expression` em `self.xml` e retorna o resultado da primeira ocorrência.
Expand Down Expand Up @@ -1471,15 +1479,18 @@ def create_profile(sender, instance, created, **kwargs):
profile, new = UserProfile.objects.get_or_create(user=instance)


def submit_to_elasticsearch(sender, instance, created, **kwargs):
""" Indexa o artigo no Elasticsearch sempre que houver alteração.
@receiver(post_save, sender=ArticleControlAttributes)
def submit_to_elasticsearch(sender, instance, **kwargs):
""" Indexa o artigo no Elasticsearch sempre que o atributo `es_is_dirty`
for igual a `True`.
"""
if instance.es_is_dirty:
celery.current_app.send_task(
'journalmanager.tasks.submit_to_elasticsearch',
args=[instance.pk])
args=[instance.article.pk])


@receiver(post_save, sender=Article)
def link_article_to_journal(sender, instance, created, **kwargs):
""" Tenta encontrar o periódico e o fascículo do artigo recém criado.
Expand All @@ -1492,18 +1503,19 @@ def link_article_to_journal(sender, instance, created, **kwargs):
args=[instance.pk])


def connect_article_post_save_signals():
models.signals.post_save.connect(submit_to_elasticsearch, sender=Article)
models.signals.post_save.connect(link_article_to_journal, sender=Article)


connect_article_post_save_signals()

@receiver(post_save, sender=Article)
def create_article_control_attributes(sender, instance, created, **kwargs):
""" Cria a entidade com os atributos de controle da instância de `Article`.
"""
ctrl_attrs, ctrl_attrs_created = ArticleControlAttributes.objects.get_or_create(
article=instance)

def disconnect_article_post_save_signals():
models.signals.post_save.disconnect(submit_to_elasticsearch, sender=Article)
models.signals.post_save.disconnect(link_article_to_journal, sender=Article)
if ctrl_attrs_created:
linkage_is_pending = instance.article_type in LINKABLE_ARTICLE_TYPES
ctrl_attrs.articles_linkage_is_pending = linkage_is_pending
ctrl_attrs.save()


# Callback da tasty-pie para a geração de token para os usuários
models.signals.post_save.connect(create_api_key, sender=User)

Loading

0 comments on commit 377907a

Please sign in to comment.