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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -283,3 +283,5 @@ backend/target/media/
pg_data/
data/
log/

docker-compose.yml
164 changes: 0 additions & 164 deletions Installation.md

This file was deleted.

85 changes: 42 additions & 43 deletions backend/target/metadata/api/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import math

from django.conf import settings
from rest_framework import status
from rest_framework.decorators import action
Expand All @@ -12,7 +14,6 @@

from .serializers import ColumnSerializer
from .serializers import NestedTableSerializer
from .serializers import ResumedColumnSerializer
from .serializers import SchemaSerializer
from .serializers import SettingsSerializer
from .serializers import TableSerializer
Expand All @@ -21,8 +22,6 @@
class TableRegistrationError(Exception):
"""Raised when table registration fails"""

pass


class TableDeletePermissionError(PermissionError):
"""Raised when a user tries to delete a table without permission"""
Expand Down Expand Up @@ -149,7 +148,8 @@ def register_table(self, user, data):
tablename=data.get("name"),
):
table_name = f"{data.get('schema')}.{data.get('name')}"
raise TableRegistrationError(f"Table {table_name} not found in database")
msg = f"Table {table_name} not found in database"
raise TableRegistrationError(msg)

# Tamanho da tabela e quantidade de linhas estimadas.
stats = db.get_table_status(
Expand Down Expand Up @@ -206,7 +206,7 @@ def register(self, user, data):
if table.catalog_type == Table.CATALOG_TYPE_CLUSTER:
related_tablename = data.get("related_table_name", None)
if not related_tablename:
raise MissingRelatedTableError()
raise MissingRelatedTableError # noqa: TRY301

# region Register related table if not registered
if related_tablename:
Expand Down Expand Up @@ -264,7 +264,7 @@ def create(self, request):
data = self.get_serializer(instance=table).data
return Response(data, status=status.HTTP_201_CREATED)

except Exception as e:
except Exception as e: # noqa: BLE001
content = {"error": str(e)}
return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

Expand Down Expand Up @@ -356,7 +356,9 @@ def pending_registration(self, request):
return Response({}, status=status.HTTP_200_OK)

def check_mandatory_ucds(self, table_ucds, required_ucds):
"""Verifica se todos os UCDs obrigatórios estão presentes e têm colunas válidas."""
"""Verifica se todos os UCDs
obrigatórios estão presentes e têm colunas válidas.
"""
missing = []
for ucd in required_ucds:
column = table_ucds.get(ucd)
Expand All @@ -379,7 +381,8 @@ def complete_registration(self, request, pk=None):
# Check if related table have all required UCDs assigned
related_ucds = self.get_table_ucds(table.related_table)
missing = self.check_mandatory_ucds(
related_ucds, Table.RELATED_REQUIRED_UCDS
related_ucds,
Table.RELATED_REQUIRED_UCDS,
)
if len(missing) > 0:
return Response(
Expand Down Expand Up @@ -430,42 +433,46 @@ def parse_filters(self, query_params):

def perform_destroy(self, instance):
if instance.schema.owner != self.request.user:
raise TableDeletePermissionError()
raise TableDeletePermissionError

if instance.related_table:
instance.related_table.delete()

instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

def convert_bigints_to_string(self, data, bigint_columns):
def sanitize_rows(self, data, bigint_columns=None):
if isinstance(data, list):
return [self.sanitize_rows(item, bigint_columns) for item in data]
if isinstance(data, dict):
return {
k: str(v)
if k in bigint_columns and isinstance(v, int) and v > 9007199254740991
else v
for k, v in data.items()
}
elif isinstance(data, list):
return [
self.convert_bigints_to_string(item, bigint_columns) for item in data
]
result = {}
for k, v in data.items():
if (isinstance(v, float) and not math.isfinite(v)) or (
isinstance(v, str) and v == "None"
):
result[k] = None
elif (
bigint_columns
and k in bigint_columns
and isinstance(v, int)
and v > 9007199254740991 # noqa: PLR2004
):
result[k] = str(v)
else:
result[k] = self.sanitize_rows(v, bigint_columns)
return result
return data

@action(detail=True, methods=["get"])
def data(self, request, pk=None):
# print("-----------------------------")

# IMPORTANTE: Não pode ser utilizado o self.get_object()
# por que falha se um dos campos de filtro for "id"
# pk é a identificação que vem na url /{pk}/data/
# e não é afetada pelos filtros.
queryset = self.get_queryset()
table = queryset.prefetch_related("columns").get(pk=pk)

# print(table)
ucds = self.get_table_ucds(table)
# print(ucds)

# Total de linhas estimado da tabela.
count = table.nrows
Expand All @@ -476,22 +483,14 @@ def data(self, request, pk=None):
"pageSize",
int(settings.REST_FRAMEWORK["PAGE_SIZE"]),
)
# print("Page: ", page)
# print("Page Size: ", page_size)

limit = int(page_size)
offset = (limit * page) - limit

# print("Offset: ", offset)
# print("Limit: ", limit)

# # TODO: selecionar as colunas que serao utilizadas.
# columns = request.query_params.get("columns", "")
# columns = columns.split(",")
# TODO: selecionar as colunas que serao utilizadas.

# Parse Filters
url_filters = self.parse_filters(request.query_params)
# print("Filters: ", url_filters)

ordering = request.query_params.get("ordering", None)

Expand All @@ -509,9 +508,15 @@ def data(self, request, pk=None):
row.update(
{
"meta_catalog_id": table.id,
"meta_id": str(row.get(ucds.get("meta.id;meta.main"))),
"meta_ra": str(row.get(ucds.get("pos.eq.ra;meta.main"))),
"meta_dec": str(row.get(ucds.get("pos.eq.dec;meta.main"))),
"meta_id": None
if (v := row.get(ucds.get("meta.id;meta.main"))) is None
else str(v),
"meta_ra": None
if (v := row.get(ucds.get("pos.eq.ra;meta.main"))) is None
else str(v),
"meta_dec": None
if (v := row.get(ucds.get("pos.eq.dec;meta.main"))) is None
else str(v),
"meta_radius_arcmin": row.get(ucds.get("phys.angSize;src")),
},
)
Expand All @@ -523,17 +528,11 @@ def data(self, request, pk=None):
if datatype in ["bigint", "int8"]:
bigint_columns.append(col.name)

parsed_rows = self.convert_bigints_to_string(rows, bigint_columns)

# columns_data = ResumedColumnSerializer(
# table.columns.all(),
# many=True,
# ).data
parsed_rows = self.sanitize_rows(rows, bigint_columns)

results = {
"results": parsed_rows,
"count": count,
# "columns": columns_data,
"has_more": (offset + limit) < count,
}

Expand Down
27 changes: 0 additions & 27 deletions merge_production_dotenvs_in_dotenv.py

This file was deleted.

Loading