Added Notion Updater Functionality (NO CSS)

This commit is contained in:
Praneeth Bhandaru 2020-10-19 21:31:29 -04:00
parent 3e9b827e1a
commit 594c701113
20 changed files with 243 additions and 7 deletions

3
.gitignore vendored
View File

@ -2,6 +2,9 @@ led / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
secrets.py
static_files
.idea/
# C extensions
*.so

View File

@ -11,7 +11,10 @@ https://docs.djangoproject.com/en/3.1/ref/settings/
"""
from pathlib import Path
from my_secrets import secrets
try:
from my_secrets.secrets import *
except ImportError:
pass
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
@ -20,9 +23,6 @@ BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = secrets.SECRET_KEY
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
@ -38,7 +38,8 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pages',
'notion_updater',
'django_extensions',
'django_secrets'
]
@ -58,7 +59,7 @@ ROOT_URLCONF = 'config.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'DIRS': [BASE_DIR / 'templates', BASE_DIR / 'notion_updater/templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
@ -122,3 +123,6 @@ USE_TZ = True
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')
STATICFILES_DIRS = [BASE_DIR / "static"]

View File

@ -14,8 +14,9 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('notes/', include('notion_updater.urls'))
]

View File

@ -8,4 +8,6 @@
SECRET_KEYS = [
# start with your Django secret key like this:
"SECRET_KEY",
"NOTION_URL",
"NOTION_COOKIE",
]

View File

@ -0,0 +1,11 @@
# Django
SECRET_KEY = "" # Add your django secret key
# Notion Client
NOTION_URL = "" # Add the notion url manually
NOTION_COOKIE = "" # Follow the steps listed below
# 1. Login to notion and navigate to the home page of your page. (Not in Guest or Incognito)
# 2. Open up developer tools by pressing Ctrl + Shift + i, and navigate to the application tab
# 3. Click on the cookie dropdown and click on the single cookie that is located there.
# 4. Copy the token_v2 info and paste it into NOTION_COOKIE

View File

5
notion_updater/admin.py Normal file
View File

@ -0,0 +1,5 @@
from django.contrib import admin
from .models import NotionPage
# Register your models here.
admin.site.register(NotionPage)

5
notion_updater/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class NotionUpdaterConfig(AppConfig):
name = 'notion_updater'

View File

@ -0,0 +1,21 @@
# Generated by Django 3.1.2 on 2020-10-19 21:40
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='NotionPage',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url', models.URLField(max_length=300)),
],
),
]

View File

19
notion_updater/models.py Normal file
View File

@ -0,0 +1,19 @@
from django.db import models
from django.conf import settings
from notion.client import NotionClient
client = NotionClient(token_v2=settings.NOTION_COOKIE)
# Create your models here.
class NotionPage(models.Model):
url = models.URLField(max_length=300)
page = None
def __init__(self, *args, **kwargs):
super(NotionPage, self).__init__(*args, **kwargs)
if self.url:
self.page = client.get_block(self.url)
def __str__(self):
return str(self.page and self.page.title)

View File

@ -0,0 +1,8 @@
{% extends 'base.html' %}
{% load static %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/meeting.css' %}">
{% endblock css %}
{% block body %}
{{ html|safe }}
{% endblock body %}

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
</head>
<body>
<div id="notes">
{{ html|safe }}
</div>
</body>
</html>

3
notion_updater/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

7
notion_updater/urls.py Normal file
View File

@ -0,0 +1,7 @@
from django.urls import path
import notion_updater.views as views
urlpatterns = [
path('', views.test),
path('meeting/<str:meeting_id>/', views.show_meeting, name='show_meetings'),
]

81
notion_updater/views.py Normal file
View File

@ -0,0 +1,81 @@
from django.shortcuts import render
from .models import NotionPage
from django.conf import settings
# Create your views here.
def test(request):
html = ''
page = NotionPage.objects.get(url=settings.NOTION_URL).page
meeting_block = None
for block in page.children:
if block.id == '383b2866-a0ae-4f4e-b246-4131117721c0':
meeting_block = block.collection
break
for meeting in meeting_block.get_rows():
html += f'<h4><a href="/notes/meeting/{meeting.id}">{meeting.title}</a></h4>'
html += '<hr>'
return render(request, 'test.html', {'html': html})
def has_children(block):
try:
block.children
return True
except AttributeError:
return False
def pprint(dicti):
print('{')
for k in dicti.keys():
print(f'\t{k.title} : {dicti[k]}')
print('}')
def getHtml(html_dict, meeting_dict, node):
string = html_dict[node]
temp = ''
for child in meeting_dict.get(node, {}):
temp += getHtml(html_dict, meeting_dict, child)
return string.format(temp)
def show_meeting(request, meeting_id):
page = NotionPage.objects.get(url=settings.NOTION_URL).page
meeting = None
for block in page.children:
if block.id == '383b2866-a0ae-4f4e-b246-4131117721c0':
for row in block.collection.get_rows():
if row.id == meeting_id:
meeting = row
break
meeting_dict = dict()
html_dict = {meeting: '<h2>' + meeting.title.strip() + '</h2><ul>{}</ul>'}
q = [meeting]
while q and has_children(temp := q.pop(0)):
for children in temp.children:
if children.parent in meeting_dict.keys():
meeting_dict[children.parent].append(children)
else:
meeting_dict[children.parent] = [children]
q.append(children)
block_type = str(type(children)).replace('<class', '').replace('>', '').replace('notion.block.', '').replace("'", "").strip()
html_dict[children] = "<li class='" + block_type + "'>" + children.title.strip() + "<ul>{}</ul></li>"
html = getHtml(html_dict, meeting_dict, meeting)
print(html)
return render(request, "meeting.html", {'html': html})

View File

@ -6,3 +6,4 @@ future==0.18.2
pytz==2020.1
six==1.15.0
sqlparse==0.4.1
notion

4
static/css/base.css Normal file
View File

@ -0,0 +1,4 @@
.content {
padding: 15px;
margin: 10px;
}

30
static/css/meeting.css Normal file
View File

@ -0,0 +1,30 @@
@import url('https://fonts.googleapis.com/css2?family=Lemonada&display=swap');
h2 {
font-size: 40px;
margin-top: 10px;
text-align: center;
font-family: 'Lemonada', cursive;
}
.BulletedListBlock {
}
.TodoBlock {
font-weight: bold;
}
.SubheaderBlock {
list-style-type: none;
padding: 0px;
margin: 0px;
font-size: 30px;
margin-top: 5px;
font-family: 'Lemonada', cursive;
}
.SubsubheaderBlock {
list-style-type: none;
padding: 0px;
margin: 0px;
font-size: 30px;
margin-top: 5px;
font-family: 'Lemonada', cursive;
}
.TextBlock {
}

18
templates/base.html Normal file
View File

@ -0,0 +1,18 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TJ 2023 - {% block title %}{% endblock title %}</title>
<link rel="stylesheet" href="{% static 'css/base.css' %}">
{% block css %}{% endblock css %}
{% block js %}{% endblock js %}
</head>
<body>
<div class="content">
{% block body %}
{% endblock body %}
</div>
</body>
</html>