Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions backend/apps/api/v1/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
table_stats,
upload_columns,
)
from backend.apps.api.v1.views_export import ExportTablesView


def redirect_to_graphql(request):
Expand All @@ -35,4 +36,5 @@ def graphql_view():
path("columns/", columns_view),
path("tables/<uuid:table_id>/columns/", columns_view),
path("columns/<uuid:column_id>/", columns_view),
path("export/catalog/", ExportTablesView.as_view(), name="export-catalog"),
]
125 changes: 125 additions & 0 deletions backend/apps/api/v1/views_export.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# -*- coding: utf-8 -*-
import csv

from django.http import HttpResponse
from django.views import View

from backend.apps.api.v1.models import Table


class ExportTablesView(View):
def get(self, request, *args, **kwargs):
locale = request.GET.get("locale", "pt")
if locale not in ["pt", "en", "es"]:
locale = "pt"

response = HttpResponse(content_type="text/csv")
response["Content-Disposition"] = 'attachment; filename="catalog_bd.csv"'

writer = csv.writer(response)

headers = {
"pt": [
"Nome do Conjunto de Dados",
"Descrição do Conjunto de Dados",
"Nome Tabela",
"Descrição Tabela",
"Dados Mais Recentes Fechados",
"Número de linhas da tabela",
"Cobertura temporal (anos e meses que temos dados disponíveis)",
],
"en": [
"Dataset Name",
"Dataset Description",
"Table Name",
"Table Description",
"Most Recent Closed Data",
"Number of rows in the table",
"Temporal coverage (years and months for which data is available)",
],
"es": [
"Nombre del Conjunto de Datos",
"Descripción del Conjunto de Datos",
"Nombre de la Tabla",
"Descripción de la Tabla",
"Datos Más Recientes Cerrados",
"Número de filas de la tabla",
"Cobertura temporal (años y meses para los cuales hay datos disponibles)",
],
}

writer.writerow(headers[locale])

tables = (
Table.objects.select_related("dataset")
.prefetch_related("coverages", "columns", "columns__coverages")
.order_by("dataset__name")
)

status_map = {
"pt": {
"closed": "Dados Parcialmente Fechados",
"open": "Dados 100% Abertos",
"to": " a ",
},
"en": {
"closed": "Partially Closed Data",
"open": "100% Open Data",
"to": " to ",
},
"es": {
"closed": "Datos Parcialmente Cerrados",
"open": "Datos 100% Abiertos",
"to": " a ",
},
}

for table in tables:
table_coverage_is_closed = any(c.is_closed for c in table.coverages.all())
column_coverage_is_closed = any(
any(cc.is_closed for cc in col.coverages.all()) for col in table.columns.all()
)
size_is_closed = (
table.uncompressed_file_size
and 100 * 1024 * 1024 < table.uncompressed_file_size <= 1000 * 1024 * 1024
)
has_closed_coverage = (
table_coverage_is_closed or column_coverage_is_closed or size_is_closed
)

data_status = (
status_map[locale]["closed"] if has_closed_coverage else status_map[locale]["open"]
)

temporal_coverage = getattr(table, "temporal_coverage", {}) or {}
start = temporal_coverage.get("start")
end = temporal_coverage.get("end")
temporal_coverage_str = (
f"{start}{status_map[locale]['to']}{end}" if start and end else ""
)

dataset_name = ""
dataset_desc = ""
if table.dataset:
dataset_name = getattr(table.dataset, f"name_{locale}", None) or table.dataset.name
dataset_desc = (
getattr(table.dataset, f"description_{locale}", None)
or table.dataset.description
)

table_name = getattr(table, f"name_{locale}", None) or table.name
table_desc = getattr(table, f"description_{locale}", None) or table.description

writer.writerow(
[
dataset_name,
dataset_desc,
table_name,
table_desc,
data_status,
table.number_rows if table.number_rows is not None else "",
temporal_coverage_str,
]
)

return response
14 changes: 10 additions & 4 deletions backend/apps/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,22 @@
from backend.apps.account_payment.graphql import Mutation as PaymentMutation
from backend.apps.account_payment.graphql import Query as PaymentQuery
from backend.apps.api.v1.graphql import Query as APIQuery
from backend.apps.user_notifications.graphql import (
DeactivateAllTableUpdateNotification,
DeactivateTableUpdateNotification,
TableUpdateNotification,
)
from backend.apps.user_notifications.graphql import Query as UserNotificationQuery
from backend.custom.graphql_auto import build_schema

schema = build_schema(
applications=["account", "v1"],
extra_queries=[
APIQuery,
PaymentQuery,
],
extra_queries=[APIQuery, PaymentQuery, UserNotificationQuery],
extra_mutations=[
AccountMutation,
PaymentMutation,
TableUpdateNotification,
DeactivateTableUpdateNotification,
DeactivateAllTableUpdateNotification,
],
)
Empty file.
53 changes: 53 additions & 0 deletions backend/apps/user_notifications/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
# Register your models here.
from django.contrib import admin

from .models import TableUpdateSubscription


class TableUpdateSubscriptionAdmin(admin.ModelAdmin):
# Campos que serão exibidos na lista de objetos
list_display = (
"id",
"table",
"user",
"created_at",
"deactivate_at",
"last_notification",
"updated_at",
"status",
)

# Filtros laterais para facilitar a busca
list_filter = ("status", "table", "user")

# Campos que podem ser pesquisados diretamente
search_fields = ("table__name", "user__username")

# Campos que serão editáveis diretamente na lista (inline)
list_editable = ("status",)

# Exibir um campo de data mais legível na interface
date_hierarchy = "created_at"

# Definindo o formulário de exibição de detalhes
fieldsets = (
(None, {"fields": ("table", "user", "status")}),
(
"Datas",
{
"fields": ("created_at", "deactivate_at", "last_notification", "updated_at"),
"classes": ("collapse",),
},
),
)

# Campos que não serão mostrados no formulário de edição
readonly_fields = ("created_at", "deactivate_at")

# Exibir os campos na ordem desejada no formulário de edição
ordering = ("-created_at",)


# Registrar o modelo e a classe de admin personalizada
admin.site.register(TableUpdateSubscription, TableUpdateSubscriptionAdmin)
7 changes: 7 additions & 0 deletions backend/apps/user_notifications/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
from django.apps import AppConfig


class UserNotificationsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "backend.apps.user_notifications"
Loading
Loading