Skip to content

Commit

Permalink
apply reviewer suggestions in BU-ISCIII#181
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel-VM committed Jan 21, 2025
1 parent c6c0441 commit 0dc3f4f
Show file tree
Hide file tree
Showing 3 changed files with 166 additions and 290 deletions.
138 changes: 18 additions & 120 deletions conf/first_install_tables.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,172 +141,70 @@
"name": "RelecovManager",
"permissions": []
}
}, {
},
{
"model": "core.errorname",
"pk": 1,
"fields": {
"error_code": "0",
"error_name": "No Error"
"error_name": "No error"
}
},
{
"model": "core.errorname",
"pk": 2,
"fields": {
"error_code": "100",
"error_name": "AttributeError: An object attribute is missing or invalid"
"error_code": "1",
"error_name": "Schema name and version is not defined"
}
},
{
"model": "core.errorname",
"pk": 3,
"fields": {
"error_code": "101",
"error_name": "TypeError: An operation or function was applied to an object of inappropriate type"
"error_code": "3",
"error_name": "Sample already defined"
}
},
{
"model": "core.errorname",
"pk": 4,
"fields": {
"error_code": "102",
"error_name": "ValueError: An operation received an argument with the right type but inappropriate value"
"error_code": "4",
"error_name": "Sample already defined"
}
},

{
"model": "core.errorname",
"pk": 5,
"fields": {
"error_code": "103",
"error_name": "KeyError: A key was not found in a mapping or dictionary"
"error_code": "5",
"error_name": "Failed to store data"
}
},
{
"model": "core.errorname",
"pk": 6,
"fields": {
"error_code": "104",
"error_name": "IndexError: A sequence subscript was out of range"
"error_code": "6",
"error_name": "Failed to update sample state history due to invalid state or missing data"
}
},
{
"model": "core.errorname",
"pk": 7,
"fields": {
"error_code": "105",
"error_name": "ImportError: A module or object could not be imported"
}
},
{
"model": "core.errorname",
"pk": 8,
"fields": {
"error_code": "106",
"error_name": "ModuleNotFoundError: A specified module could not be found"
}
},
{
"model": "core.errorname",
"pk": 9,
"fields": {
"error_code": "107",
"error_name": "ZeroDivisionError: Division or modulo by zero"
}
},
{
"model": "core.errorname",
"pk": 10,
"fields": {
"error_code": "108",
"error_name": "FileNotFoundError: A file or directory was requested but does not exist"
}
},
{
"model": "core.errorname",
"pk": 11,
"fields": {
"error_code": "109",
"error_name": "IOError: An input/output operation failed"
}
},
{
"model": "core.errorname",
"pk": 12,
"fields": {
"error_code": "110",
"error_name": "PermissionError: An operation lacked the necessary permissions"
}
},
{
"model": "core.errorname",
"pk": 13,
"fields": {
"error_code": "111",
"error_name": "TimeoutError: An operation exceeded its designated time limit"
}
},
{
"model": "core.errorname",
"pk": 14,
"fields": {
"error_code": "112",
"error_name": "MemoryError: An operation ran out of memory"
}
},
{
"model": "core.errorname",
"pk": 15,
"fields": {
"error_code": "113",
"error_name": "RecursionError: The maximum recursion depth was exceeded"
}
},
{
"model": "core.errorname",
"pk": 16,
"fields": {
"error_code": "114",
"error_name": "NameError: A variable or function name is not defined"
}
},
{
"model": "core.errorname",
"pk": 17,
"fields": {
"error_code": "115",
"error_name": "SyntaxError: Invalid syntax in the code"
}
},
{
"model": "core.errorname",
"pk": 18,
"fields": {
"error_code": "116",
"error_name": "IndentationError: Code indentation is incorrect"
}
},
{
"model": "core.errorname",
"pk": 19,
"fields": {
"error_code": "117",
"error_name": "StopIteration: Iteration has no further items"
}
},
{
"model": "core.errorname",
"pk": 20,
"fields": {
"error_code": "118",
"error_name": "OverflowError: A numerical calculation exceeded a range limit"
"error_code": "7",
"error_name": "Accession empty or not provided"
}
},
{
"model": "core.errorname",
"pk": 21,
"pk": 999,
"fields": {
"error_code": "999",
"error_name": "Other unspecified error occurred"
"error_name": "Other"
}
}
]
76 changes: 36 additions & 40 deletions core/api/utils/common_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,54 +30,39 @@ def get_analysis_defined(s_obj):
bioinfo_analysis_fieldID__property_name="analysis_date", sample=s_obj
).values_list("value", flat=True)


def handle_sample_errors(dict_error):
"""
Validate error type. If the error is not defined in the database,
assign the 'Other' error type.
"""
# Search for the error by name
error_name_obj = core.models.ErrorName.objects.filter(
error_name=dict_error.get("error_name")
).last()

# If not found by name, search using the error code (optional)
if not error_name_obj and dict_error.get("error_code"):
error_name_obj = core.models.ErrorName.objects.filter(
error_code=dict_error["error_code"]
).last()

# If the error is still not found, assign "Other" as the default error
if not error_name_obj:
error_name_obj = core.models.ErrorName.objects.filter(
error_code="999" # Code for "Other"
).last()

# Return the identified or assigned ErrorName object
return error_name_obj


# TODO: Would it be possilbe to return a serializer object instead?
def add_sample_state_history(sample_obj, state_id, error_name=None):
"""
Adds a new state history entry for a sample and marks previous states as not current.
Since all
"""
# Validate the state exists
state_obj = core.models.SampleState.objects.filter(pk=state_id).last()
state_obj = None
if state_id:
state_obj = core.models.SampleState.objects.filter(pk=state_id).last()

# Validate the state exists or fetch the last state for the sample
if state_id:
state_obj = core.models.SampleState.objects.filter(pk=state_id).last()
else:
# If no state is defined, use the last record for that sample
state_obj = (
core.models.SampleStateHistory.objects.filter(sample=sample_obj)
.order_by('-changed_at')
.first()
)

# Si no se encuentra ningún estado, levantar una excepción
if not state_obj:
raise ValueError(f"State '{state_id}' does not exist.")
raise ValueError("No valid state found for the sample.")

# Handle error_name if provided
error_obj = None
if error_name:
error_obj = handle_sample_errors({"error_name": error_name})
error_name_obj = core.models.ErrorName.objects.filter(
error_name=error_name
).last()
else:
# Assign the 'No Error' entry with pk=1 as default
error_obj = core.models.ErrorName.objects.filter(pk=1).first()
if not error_obj:
raise ValueError(
"Default error entry with pk=1 does not exist in the database."
)
# Assign the 'other' entry with pk=1 as default
error_name_obj = core.models.ErrorName.objects.filter(pk=999).first()

# Mark previous states as not current
core.models.SampleStateHistory.objects.filter(
Expand All @@ -90,6 +75,17 @@ def add_sample_state_history(sample_obj, state_id, error_name=None):
"changed_at": timezone.now(),
"sample": sample_obj.pk,
"state": state_obj.pk,
"error_name": error_obj.pk,
"error_name": error_name_obj.pk,
}
return state_history_obj

# Serialization
state_history_serializer = core.api.serializers.SampleStateHistorySerializer(
data=state_history_obj
)
# Validation
if not state_history_serializer.is_valid():
return Response(
state_history_serializer.errors, status=status.HTTP_400_BAD_REQUEST
)
state_history_serializer.save()
return True
Loading

0 comments on commit 0dc3f4f

Please sign in to comment.