import django.http from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_GET from django.template.defaultfilters import slugify import fastn.django from . import models from . import utils # docs: /dev/pages/presentation/ # request: django.http.HttpRequest # test example: # http://127.0.0.1:7999/view/presentation/?org-slug=fifthtry&presentation-slug=blank-template&order=1 @csrf_exempt @require_GET def presentation(request: django.http.HttpRequest): org_slug = request.GET["org-slug"] presentation_slug = request.GET["presentation-slug"] order_s: str = request.GET["order"] try: order: int = int(order_s) except (ValueError, TypeError): return django.http.HttpResponseNotFound( f"order parameter must be an integer value, " f"found {order_s}" ) presentation = models.Presentation.objects.get_or_404( org__slug=org_slug, slug=presentation_slug ) current_slide = presentation.slides.get_or_404(order=order) # presentation-setting-url: /slides/scenarios/fastn-presentation-logged-in/ # present-url: /slides/scenarios/fastn-presentation-logged-in/ # slide-templates: $slide-templates # thumbnails: $slide-thumbnails # todo: extract slide templates on visibility criteria # based on user's privileges template_slides = models.Slide.objects.filter(presentation__is_template=True) slide_template_data = [s.to_template_slide_data() for s in template_slides] response = { "title": presentation.title, "url": presentation.presentation_url(), "is-valid": True, "settings-url": presentation.settings_url(), "present-url": presentation.present_url(), "slide": current_slide.to_detail_slide(), "thumbnails": [ s.to_slide_thumbnail() for s in presentation.slides.all().order_by("order") ], "slide-templates": slide_template_data, # TODO "comments": [], # TODO } return django.http.JsonResponse(response, status=200) @csrf_exempt @require_GET def present(request: django.http.HttpRequest): presentation_slug = request.GET["presentation-slug"] org_slug = request.GET["org-slug"] slide_order = 1 try: current_presentation = models.Presentation.objects.get( slug=presentation_slug, org__slug=org_slug ) except models.Presentation.DoesNotExist: return django.http.HttpResponseNotFound( f"Presentation {presentation_slug} for org {org_slug} not found" ) all_slides = models.Slide.objects.filter( presentation=current_presentation ).order_by("order") all_slide_previews = [s.preview_url() for s in all_slides] response = { "all-slide-previews": all_slide_previews, "current-slide-order": slide_order, "editor-url": f"p/{org_slug}/{presentation_slug}/", } return django.http.JsonResponse(response, status=200) # Test # http://127.0.0.1:7999/api/settings/?presentation_slug=blank-template def presentation_settings(request: django.http.HttpRequest): """ method: get expects query param: presentation_slug, org_slug :return: { settings-conf: string, fastn-conf: string, is-template: boolean, editor-url: string, presentation-title: string, } """ presentation_slug = request.GET["presentation-slug"] org_slug = request.GET["org-slug"] try: current_org = models.Org.objects.get(slug=org_slug) except models.Org.DoesNotExist: return django.http.HttpResponseNotFound(f"Team {org_slug} not found") try: current_presentation = models.Presentation.objects.get( slug=presentation_slug, org__slug=org_slug ) except models.Presentation.DoesNotExist: return django.http.HttpResponseNotFound( f"Presentation {presentation_slug} for org {org_slug} not found" ) response = { "presentation-title": current_presentation.title, "org-name": current_org.name, "fastn-conf": current_presentation.fastn_ftd, "settings-conf": current_presentation.setting_ftd, "is-template": current_presentation.is_template, "editor-url": f"p/{org_slug}/{presentation_slug}/", } return django.http.JsonResponse(response, status=200) def get_public_template(request: django.http.HttpRequest): org_slug = request.GET["org_slug"] template_slug = request.GET["template_slug"] response = models.Presentation.objects.get( org__slug=org_slug, slug=template_slug ).to_detail_presentation() response["username"] = request.user.username return django.http.JsonResponse(response) def get_public_templates(_request: django.http.HttpRequest): presentations = models.Presentation.objects.filter( is_template=True, visibility=models.VISIBILITY_EVERYONE, ) template_data = [] for presentation in presentations: template_data.append(presentation.to_public_presentation()) return django.http.JsonResponse({"templates": template_data}) # dashboard expects: # # -- record dashboard-data: # presentation list presentations: # template list templates: # # -- record presentation: # caption title: # string url: # string thumbnail: # string updated-on: # # # -- record template: # caption title: # string url: # string thumbnail: def dashboard(request: django.http.HttpRequest): org_slug = request.GET.get("org-slug") or request.user.username # org_slug = request.GET.get("org-slug", request.user.username) username = request.user.username current_user, _ = models.User.objects.get_or_create(username=username) current_org, _ = models.Org.objects.get_or_create( owner=current_user, defaults={"name": username, "slug": slugify(username)} ) org_name = current_org.name toc_links = [ {"title": "Dashboard", "link": f"/t/{org_slug}/"}, {"title": "Templates", "link": "/community/templates/"}, ] # TODO: implement pagination return django.http.JsonResponse( { "toc-links": toc_links, "org-name": org_name, "org-slug": org_slug, "presentations": [ p.dashboard_view() for p in models.Presentation.objects.filter(org__slug=org_slug)[:10] ], } )