arcology/localapi/views.py

146 lines
4.7 KiB
Python

# [[file:../localapi.org::*Server view and Arroyo Emacs lisp scaffolding][Server view and Arroyo Emacs lisp scaffolding:3]]
from django.http import HttpRequest, HttpResponse, HttpResponseNotFound, Http404, JsonResponse
from django.shortcuts import render, get_object_or_404
from arcology.models import Page, Feed, Site
from roam.models import Link
from localapi.auth import authenticated
from prometheus_client import Counter, Histogram
import logging
logger = logging.getLogger(__name__)
# Server view and Arroyo Emacs lisp scaffolding:3 ends here
# [[file:../localapi.org::*Server view and Arroyo Emacs lisp scaffolding][Server view and Arroyo Emacs lisp scaffolding:4]]
@authenticated
def index(request):
return JsonResponse(dict(state="ok :)"))
# Server view and Arroyo Emacs lisp scaffolding:4 ends here
# [[file:../localapi.org::*Keyword metadata][Keyword metadata:1]]
import roam.models
def _json_keywords(keywords):
return [
dict(path=kw.path.path, keyword=kw.keyword, value=kw.value)
for kw in keywords
]
# Keyword metadata:1 ends here
# [[file:../localapi.org::*/keywords/{key}][/keywords/{key}:1]]
@authenticated
def keyword_by_key(request, key):
keywords = roam.models.Keyword.objects.filter(keyword=key).all()
return JsonResponse(dict(
state="ok :)",
key=key,
keywords=_json_keywords(keywords),
))
# /keywords/{key}:1 ends here
# [[file:../localapi.org::*/keywords/{key}/{value}][/keywords/{key}/{value}:1]]
@authenticated
def keyword_by_key_value(request, key, value):
keywords = roam.models.Keyword.objects.filter(keyword=key, value=value).all()
return JsonResponse(dict(
state="ok :)",
key=key,
value=value,
keywords=_json_keywords(keywords),
))
# /keywords/{key}/{value}:1 ends here
# [[file:../localapi.org::*Page and File metadata][Page and File metadata:1]]
import arcology.models
def _json_page(page):
if page is None:
return page
return dict(
title=page.title,
url=page.to_url(),
site=page.site.title,
keywords={
kw.keyword: kw.value
for kw in page.collect_keywords().all()
},
tags=list(set([tag.tag for tag in page.collect_tags()])),
references=[reference.ref for reference in page.collect_references()],
)
# Page and File metadata:1 ends here
# [[file:../localapi.org::*Page and File metadata][Page and File metadata:3]]
@authenticated
def page_metadata(request, route_key):
page = arcology.models.Page.objects.get(route_key=route_key)
keywords = page.file.keyword_set.all()
return JsonResponse(dict(
state="ok :)",
route_key=route_key,
file=page.file.path,
page=_json_page(page),
keywords=_json_keywords(keywords)
))
# Page and File metadata:3 ends here
# [[file:../localapi.org::*Page and File metadata][Page and File metadata:5]]
from django.conf import settings
@authenticated
def file_metadata(request, file_path):
final_path = settings.ARCOLOGY_BASE_DIR.joinpath(file_path)
print(f"1 {final_path}")
the_file = roam.models.File.objects.get(path=final_path)
print(f"2 {the_file}")
page = the_file.page_set.first()
print(f"3 {page}")
root_heading = the_file.heading_set.filter(level=0).first()
print(f"4 {root_heading}")
return JsonResponse(dict(
state="ok :)",
file_path=file_path,
file=dict(
path=the_file.path,
root_heading=dict(
title=root_heading.title,
id=root_heading.node_id,
),
page=_json_page(page),
),
))
# Page and File metadata:5 ends here
# [[file:../localapi.org::*Get all files by tag][Get all files by tag:1]]
@authenticated
def files_by_tag(request, key):
# final_path = settings.ARCOLOGY_BASE_DIR.joinpath(file_path)
the_tags = roam.models.Tag.objects.filter(tag=key).all()
return JsonResponse(dict(
state="ok :)",
tag=key,
files=list(set([
tag.heading.path.path
for tag in the_tags
]))
))
# Get all files by tag:1 ends here
# [[file:../localapi.org::*\[\[id:20231217T154938.132553\]\[Arcology generate Command\]\]][[[id:20231217T154938.132553][Arcology generate Command]]:3]]
import tempfile
from django.core.management import call_command
@authenticated
def generate(request, module, role=None):
f = tempfile.NamedTemporaryFile()
fn = f.name
# i hate this!!!
if role:
call_command('generate', destination=fn, module=module, role=role)
else:
call_command('generate', destination=fn, module=module)
f.seek(0)
return HttpResponse(f)
# [[id:20231217T154938.132553][Arcology generate Command]]:3 ends here