Skip to content

Commit 6586201

Browse files
committed
Merge branch 'django-filer' into dev
2 parents 92516de + 8c1074d commit 6586201

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+579
-780
lines changed

Pipfile

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,15 @@ beautifulsoup4 = "*"
3636
djangorestframework = "*"
3737
django-cors-headers = "*"
3838
boltons = "*"
39-
retrying = "*"
39+
django-filer = "*"
40+
django-mptt = ">=0.6"
41+
easy_thumbnails = ">=2.6.0"
42+
django-polymorphic = ">=0.7"
43+
Pillow = ">=2.3.0"
4044
tornado = ">=4.2.0,<6.0.0"
4145
redis = ">=3.2.0"
46+
retrying = "*"
47+
django-elasticsearch-dsl = "*"
4248

4349
[packages.pdfkit]
4450
editable = true
@@ -50,13 +56,8 @@ editable = true
5056
git = "https://github.com/PaesslerAG/django-currentuser"
5157
ref = "master"
5258

53-
[packages.easy-thumbnails]
54-
editable = true
55-
git = "https://github.com/SmileyChris/easy-thumbnails"
56-
ref = "master"
57-
5859
[packages.celery]
5960
editable = true
60-
git = "https://github.com/PaesslerAG/django-currentuser"
61+
git = "https://github.com/celery/celery"
6162
ref = "master"
6263
extras = [ "redis",]

Pipfile.lock

Lines changed: 153 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xram_memory/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
from django.contrib.admin.apps import AdminConfig
2+
from filer.apps import FilerConfig as OriginalFilerConfig
23

34

45
class DefaultAdminConfig(AdminConfig):
56
default_site = 'xram_memory.admin.DefaultAdminSite'
7+
8+
9+
class FilerConfig(OriginalFilerConfig):
10+
verbose_name = "Pastas e arquivos"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from .models.news import NewsAdmin
2-
from .models.documents import DocumentAdmin
2+
from .models.document import DocumentAdmin

xram_memory/artifact/admin/forms/news.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@ class NewsAdminForm(forms.ModelForm):
1818
"""
1919
# TODO: fazer com que os campos abaixo não sejam logados em revisões de conteúdo?
2020
# TODO: definir os campos que este formulário aceitará: https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#selecting-the-fields-to-use
21-
# TODO: chamar o campo 'slug' de Endereço e gerar uma URL para o endereço da notícia com template no form
2221

2322
# campos para definir operações adicionais para a notícia durante e após o salvamento
2423
set_basic_info = forms.BooleanField(
2524
label="Tentar inferir informações sobre essa notícia automaticamente",
2625
required=False,
27-
help_text="Apenas com o endereço da notícia preenchido, o sistema tentará buscar informações básicas sobre esta notícia",
26+
help_text="Apenas com o endereço da notícia preenchido, o sistema preencherá os outros campos automaticamente",
2827
)
2928
fetch_archived_url = forms.BooleanField(
3029
label="Procurar uma versão arquivada dessa notícia automaticamente no Internet Archive",
@@ -33,7 +32,7 @@ class NewsAdminForm(forms.ModelForm):
3332
)
3433
add_pdf_capture = forms.BooleanField(
3534
label="Capturar a página dessa notícia em formato PDF",
36-
help_text="O sistema tentará capturar uma versão da página dessa notícia em PDF",
35+
help_text="Se marcado, o sistema fará uma captura da página dessa notícia em PDF",
3736
required=False,
3837
)
3938

@@ -49,11 +48,12 @@ def __init__(self, *args, **kwargs):
4948
self.initial['fetch_archived_url'] = not self.instance.archived_news_url
5049
self.initial['add_pdf_capture'] = not self.instance.has_pdf_capture
5150

52-
if self.instance.pk:
53-
# altere as descrições para os campos acima de acordo com o estado do modelo
54-
# TODO: utilizar a propriedades conforme acima para definir as descrições
55-
# TODO: atualizar as descrições abaixo para 'obter as informações automaticamente etc.'
56-
self.fields['set_basic_info'].label = 'Tentar inferir informações sobre essa notícia novamente'
51+
if self.instance.pk is None:
52+
self.fields['set_basic_info'].label = 'Obter informações sobre essa notícia automaticamente'
53+
self.fields['fetch_archived_url'].label = 'Procurar por uma versão arquivada dessa notícia no <a href="https://archive.org/">Internet Archive</a>'
54+
self.fields['add_pdf_capture'].label = 'Fazer uma captura dessa notícia em formato PDF'
55+
else:
56+
self.fields['set_basic_info'].label = 'Obter informações sobre essa notícia novamente'
5757
self.fields['fetch_archived_url'].label = 'Procurar novamente por uma versão arquivada dessa notícia no Internet Archive'
5858
self.fields['add_pdf_capture'].label = 'Adicionar uma nova captura de página dessa notícia em formato PDF'
5959

@@ -73,12 +73,15 @@ def clean(self):
7373
'add_pdf_capture', False)
7474

7575
url = cleaned_data.get('url', None)
76-
# TODO: verificar slug vazia
7776
slug = cleaned_data.get('slug', None)
7877

79-
if not set_basic_info and title == '':
80-
self.add_error(
81-
'title', 'Se você optou por inserir os dados manualmente, é necessário informar ao menos um título')
78+
if not set_basic_info:
79+
if not title:
80+
self.add_error(
81+
'title', 'Se você optou por inserir os dados manualmente, é necessário informar ao menos um título')
82+
if not slug:
83+
self.add_error(
84+
'slug', 'Se você optou por inserir os dados manualmente, é informar um endereço')
8285

8386
# define em campos privados do modelo quais operações adicionais o método save() deve
8487
# realizar
@@ -95,7 +98,7 @@ def clean(self):
9598
raise ValueError()
9699
except ValueError:
97100
self.add_error(
98-
'title', "Não foi possível inferir o título automaticamente, preencha ele manualmente.")
101+
'title', "Não foi possível determinar um título automaticamente, preencha ele manualmente.")
99102
except:
100103
self.add_error(None,
101104
"Não foi possível determinar automaticamente informações sobre esta notícia no momento, por-favor insira os dados dela manualmente.")
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from django.contrib import admin
2+
from filer.admin.fileadmin import FileAdmin
3+
from xram_memory.artifact.models import Document
4+
from easy_thumbnails.widgets import ImageClearableFileInput
5+
from easy_thumbnails.fields import ThumbnailerField
6+
7+
8+
@admin.register(Document)
9+
class DocumentAdmin(FileAdmin):
10+
list_display = (
11+
'id',
12+
'folder',
13+
'file',
14+
'name',
15+
'owner',
16+
'uploaded_at',
17+
'modified_at',
18+
'mime_type',
19+
'is_user_object',
20+
)
21+
list_filter = (
22+
'folder',
23+
'owner',
24+
'uploaded_at',
25+
'modified_at',
26+
'is_public',
27+
'is_user_object',
28+
)
29+
date_hierarchy = 'uploaded_at'
30+
search_fields = ('name',)
31+
32+
33+
DocumentAdmin.readonly_fields = DocumentAdmin.readonly_fields + ('mime_type',)
34+
DocumentAdmin.fieldsets = FileAdmin.build_fieldsets(
35+
extra_advanced_fields=("mime_type",))

xram_memory/artifact/admin/models/documents.py

Lines changed: 0 additions & 48 deletions
This file was deleted.

xram_memory/artifact/migrations/0001_initial.py

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
# Generated by Django 2.1.5 on 2019-01-22 20:39
1+
# Generated by Django 2.1.7 on 2019-03-22 01:52
22

3-
from django.conf import settings
43
import django.core.validators
54
from django.db import migrations, models
65
import django.db.models.deletion
7-
import xram_memory.artifact.models.documents
6+
import easy_thumbnails.fields
87
import xram_memory.utils
98

109

@@ -13,35 +12,22 @@ class Migration(migrations.Migration):
1312
initial = True
1413

1514
dependencies = [
16-
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
17-
('taxonomy', '0003_auto_20190121_1210'),
15+
('filer', '0010_auto_20180414_2058'),
1816
]
1917

2018
operations = [
2119
migrations.CreateModel(
2220
name='Document',
2321
fields=[
24-
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
25-
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Criado em')),
26-
('modified_at', models.DateTimeField(auto_now=True, verbose_name='Modificado em')),
27-
('published', models.BooleanField(default=True, verbose_name='Publicado?')),
28-
('featured', models.BooleanField(default=True, verbose_name='Em destaque na página inicial?')),
29-
('title', models.CharField(blank=True, help_text='Título', max_length=255, verbose_name='Título')),
30-
('teaser', models.TextField(blank=True, help_text='Resumo ou chamada', null=True, verbose_name='Resumo ou chamada')),
31-
('slug', models.SlugField(blank=True, verbose_name='Slug')),
22+
('file_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='filer.File')),
3223
('mime_type', models.CharField(blank=True, editable=False, help_text='Tipo do arquivo', max_length=255, verbose_name='Tipo')),
33-
('file_size', models.CharField(default='0', editable=False, help_text='Tamanho do arquivo em bytes', max_length=100, verbose_name='Tamanho')),
3424
('is_user_object', models.BooleanField(default=True, editable=False, help_text='Indica se o arquivo foi inserido diretamente por um usuário', verbose_name='Objeto criado pelo usuário?')),
35-
('file', models.FileField(upload_to=xram_memory.artifact.models.documents.get_file_path, validators=[xram_memory.utils.FileValidator(content_types=('image/jpeg', 'image/png', 'image/gif', 'image/webp', 'application/pdf'))], verbose_name='Arquivo')),
36-
('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='document_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criado por')),
37-
('keywords', models.ManyToManyField(blank=True, to='taxonomy.Keyword', verbose_name='Palavras-chave')),
38-
('modified_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='document_last_modifier', to=settings.AUTH_USER_MODEL, verbose_name='Modificado por')),
39-
('subjects', models.ManyToManyField(blank=True, to='taxonomy.Subject', verbose_name='Assuntos')),
4025
],
4126
options={
4227
'verbose_name': 'Documento',
4328
'verbose_name_plural': 'Documentos',
4429
},
30+
bases=('filer.file',),
4531
),
4632
migrations.CreateModel(
4733
name='News',
@@ -53,16 +39,13 @@ class Migration(migrations.Migration):
5339
('featured', models.BooleanField(default=True, verbose_name='Em destaque na página inicial?')),
5440
('title', models.CharField(blank=True, help_text='Título', max_length=255, verbose_name='Título')),
5541
('teaser', models.TextField(blank=True, help_text='Resumo ou chamada', null=True, verbose_name='Resumo ou chamada')),
56-
('slug', models.SlugField(blank=True, verbose_name='Slug')),
42+
('slug', models.SlugField(blank=True, help_text='Parte do endereço pelo qual este artefato poderá ser acessado', verbose_name='Endereço')),
5743
('url', models.URLField(help_text='Endereço original da notícia', max_length=255, unique=True, validators=[django.core.validators.URLValidator], verbose_name='Endereço')),
5844
('archived_news_url', models.URLField(blank=True, help_text="Endereço da notícia no <a href='https://archive.org/'>Archive.org</a>", max_length=255, null=True, verbose_name='Endereço no Internet Archive')),
5945
('authors', models.TextField(blank=True, help_text='Nomes dos autores, separados por vírgula', verbose_name='Autores')),
60-
('body', models.TextField(blank=True, help_text='Texto integral da notícia', verbose_name='Texto da notícia')),
46+
('body', models.TextField(blank=True, help_text='Texto integral da notícia', null=True, verbose_name='Texto da notícia')),
6147
('published_date', models.DateTimeField(blank=True, help_text='Data em que a notícia foi publicada', null=True, verbose_name='Data de publicação')),
62-
('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='news_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criado por')),
63-
('keywords', models.ManyToManyField(blank=True, to='taxonomy.Keyword', verbose_name='Palavras-chave')),
64-
('modified_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='news_last_modifier', to=settings.AUTH_USER_MODEL, verbose_name='Modificado por')),
65-
('subjects', models.ManyToManyField(blank=True, to='taxonomy.Subject', verbose_name='Assuntos')),
48+
('language', models.CharField(blank=True, default='pt', max_length=2, null=True)),
6649
],
6750
options={
6851
'verbose_name': 'Notícia',
@@ -74,22 +57,38 @@ class Migration(migrations.Migration):
7457
fields=[
7558
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
7659
('image_capture_date', models.DateTimeField(auto_now_add=True, help_text='Data desta captura', null=True, verbose_name='Data de captura')),
77-
('original_url', models.CharField(max_length=255, unique=True, verbose_name='Endereço original da imagem')),
78-
('image_document', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='artifact.Document', verbose_name='Documento de imagem')),
79-
('news', models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='image_capture', to='artifact.News', verbose_name='Notícia')),
60+
('original_url', models.CharField(max_length=255, verbose_name='Endereço original da imagem')),
8061
],
8162
options={
8263
'verbose_name': 'Imagem de Notícia',
8364
'verbose_name_plural': 'Imagens de Notícias',
8465
},
8566
),
67+
migrations.CreateModel(
68+
name='Newspaper',
69+
fields=[
70+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
71+
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Criado em')),
72+
('modified_at', models.DateTimeField(auto_now=True, verbose_name='Modificado em')),
73+
('published', models.BooleanField(default=True, verbose_name='Publicado?')),
74+
('featured', models.BooleanField(default=True, verbose_name='Em destaque na página inicial?')),
75+
('title', models.CharField(blank=True, help_text='Título', max_length=255, verbose_name='Título')),
76+
('slug', models.SlugField(blank=True, help_text='Parte do endereço pelo qual este artefato poderá ser acessado', verbose_name='Endereço')),
77+
('url', models.URLField(help_text='Endereço do site', max_length=255, unique=True, validators=[django.core.validators.URLValidator], verbose_name='Endereço')),
78+
('description', models.TextField(blank=True, help_text='A descrição desse veículo/site', verbose_name='Descrição')),
79+
('logo', easy_thumbnails.fields.ThumbnailerField(blank=True, upload_to='news_sources_logos', validators=[xram_memory.utils.FileValidator(content_types=('image/jpeg', 'image/png', 'image/gif', 'image/webp'))], verbose_name='Logotipo')),
80+
],
81+
options={
82+
'abstract': False,
83+
},
84+
),
8685
migrations.CreateModel(
8786
name='NewsPDFCapture',
8887
fields=[
8988
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
9089
('pdf_capture_date', models.DateTimeField(auto_now_add=True, help_text='Data desta captura', null=True, verbose_name='Data de captura')),
91-
('news', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pdf_captures', to='artifact.News', verbose_name='Notícia')),
92-
('pdf_document', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='artifact.Document', verbose_name='Documento PDF')),
90+
('news', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pdf_captures', to='artifact.News', verbose_name='Notícia')),
91+
('pdf_document', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='filer.File', verbose_name='Documento PDF')),
9392
],
9493
options={
9594
'verbose_name': 'Captura de Notícia em PDF',

0 commit comments

Comments
 (0)