mirror of
https://github.com/Rushilwiz/tj2023.git
synced 2025-04-11 07:40:17 -04:00
Added Notion Updater Functionality (NO CSS)
This commit is contained in:
parent
3e9b827e1a
commit
594c701113
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -2,6 +2,9 @@ led / optimized / DLL files
|
|||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
secrets.py
|
||||
static_files
|
||||
.idea/
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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'))
|
||||
]
|
||||
|
|
|
@ -8,4 +8,6 @@
|
|||
SECRET_KEYS = [
|
||||
# start with your Django secret key like this:
|
||||
"SECRET_KEY",
|
||||
"NOTION_URL",
|
||||
"NOTION_COOKIE",
|
||||
]
|
||||
|
|
11
my_secrets/secrets.py.sample.py
Normal file
11
my_secrets/secrets.py.sample.py
Normal 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
|
0
notion_updater/__init__.py
Normal file
0
notion_updater/__init__.py
Normal file
5
notion_updater/admin.py
Normal file
5
notion_updater/admin.py
Normal 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
5
notion_updater/apps.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class NotionUpdaterConfig(AppConfig):
|
||||
name = 'notion_updater'
|
21
notion_updater/migrations/0001_initial.py
Normal file
21
notion_updater/migrations/0001_initial.py
Normal 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)),
|
||||
],
|
||||
),
|
||||
]
|
0
notion_updater/migrations/__init__.py
Normal file
0
notion_updater/migrations/__init__.py
Normal file
19
notion_updater/models.py
Normal file
19
notion_updater/models.py
Normal 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)
|
8
notion_updater/templates/meeting.html
Normal file
8
notion_updater/templates/meeting.html
Normal 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 %}
|
13
notion_updater/templates/test.html
Normal file
13
notion_updater/templates/test.html
Normal 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
3
notion_updater/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
7
notion_updater/urls.py
Normal file
7
notion_updater/urls.py
Normal 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
81
notion_updater/views.py
Normal 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})
|
|
@ -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
4
static/css/base.css
Normal file
|
@ -0,0 +1,4 @@
|
|||
.content {
|
||||
padding: 15px;
|
||||
margin: 10px;
|
||||
}
|
30
static/css/meeting.css
Normal file
30
static/css/meeting.css
Normal 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
18
templates/base.html
Normal 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>
|
Loading…
Reference in New Issue
Block a user