feat(api): Add item metadata to markdown field for renderable items

ref: #466 #467 nofusscomputing/centurion_erp_ui#40
This commit is contained in:
2025-01-07 13:19:25 +09:30
parent f341adab8e
commit b65da4efac

View File

@ -1,3 +1,5 @@
import re
from django.conf import settings
from django.utils.encoding import force_str
@ -270,6 +272,84 @@ class ReactUIMetadata(OverRideJSONAPIMetadata):
field.field_name in serializer.included_serializers
)
if field_info["type"] == 'Markdown':
linked_models = []
linked_tickets = []
field_info["render"] = {
'models': {},
'tickets': {},
}
if field.context['view'].kwargs.get('pk', None):
from core.lib.slash_commands.linked_model import CommandLinkedModel
value = getattr(list(field.context['view'].queryset)[0], field.source, None)
if value:
linked_models = re.findall(r'\s\$(?P<model_type>[a-z_]+)-(?P<model_id>\d+)[\s|\n]?', value)
linked_tickets = re.findall(r'(?P<ticket>#(?P<number>\d+))', value)
from core.models.ticket.ticket import Ticket
for ticket, number in linked_tickets:
try:
item = Ticket.objects.get( pk = number )
field_info["render"]['tickets'].update({
number: {
'status': Ticket.TicketStatus.All(item.status).label,
'ticket_type': Ticket.TicketType(item.ticket_type).label,
'title': str(item),
'url': item.get_url()
}
})
except Ticket.DoesNotExist as e:
pass
for model_type, model_id in linked_models:
try:
model, item_type = CommandLinkedModel().get_model( model_type )
if model:
item = model.objects.get( pk = model_id )
item_meta = {
model_id: {
'title': str(item),
'url': item.get_url(),
}
}
if not field_info["render"]['models'].get(model_type, None):
field_info["render"]['models'].update({
model_type: item_meta
})
else:
field_info["render"]['models'][model_type].update( item_meta )
except Ticket.DoesNotExist as e:
pass
return field_info