aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-12-16 21:31:44 +0000
committerBobby <[email protected]>2024-12-16 21:31:44 +0000
commita12bd485351559af96d019d55a4b0f8dbc1b7265 (patch)
treea52976f7071e2d7ba8d592b82b319e19477eabab
parentea8f5e8517161c1bd52f61198138dfd2fc72f8e2 (diff)
downloadthatcomputerscientist-a12bd485351559af96d019d55a4b0f8dbc1b7265.tar.xz
thatcomputerscientist-a12bd485351559af96d019d55a4b0f8dbc1b7265.zip
ja trans stuff
-rw-r--r--apps/pagoda/views.py88
-rw-r--r--templates/en/pagoda/site_dashboard.html0
-rw-r--r--templates/ja/pagoda/home.html166
-rw-r--r--templates/ja/pagoda/site_verification.html165
-rw-r--r--thatcomputerscientist/settings.py2
5 files changed, 362 insertions, 59 deletions
diff --git a/apps/pagoda/views.py b/apps/pagoda/views.py
index ad8f3079..a18a1b0b 100644
--- a/apps/pagoda/views.py
+++ b/apps/pagoda/views.py
@@ -7,7 +7,11 @@ from internal.pagoda_utilities import (
pagoda_verification_record_generator,
pagoda_url_sanitizer,
)
-from django.http import Http404, HttpResponseRedirect
+from django.http import (
+ HttpResponse,
+ HttpResponseNotFound,
+ HttpResponseRedirect,
+)
from django.urls import reverse
from django.contrib import messages
import dns.resolver
@@ -78,24 +82,26 @@ def home(request):
@login_required
def site_dashboard(request, site_id):
LANGUAGE_CODE = i18npatterns(request.LANGUAGE_CODE)
- site = PagodaSites.objects.get(siteUniqueIdentifier=site_id, owner=request.user)
- context = {
- "site": site,
- }
- META = {
- "title": f"Manage {site.name} — The Pagoda Realm",
- }
- request.meta.update(META)
- if site.verified:
- return render(
- request, f"{LANGUAGE_CODE}/pagoda/site_verification.html", context
- )
- elif not site.verified:
- return render(
- request, f"{LANGUAGE_CODE}/pagoda/site_verification.html", context
- )
- else:
- return Http404()
+ try:
+ site = PagodaSites.objects.get(siteUniqueIdentifier=site_id, owner=request.user)
+ context = {
+ "site": site,
+ }
+ META = {
+ "title": f"Manage {site.name} — The Pagoda Realm",
+ }
+ request.meta.update(META)
+ if site.verified:
+ return render(
+ request, f"{LANGUAGE_CODE}/pagoda/site_dashboard.html", context
+ )
+
+ if not site.verified:
+ return render(
+ request, f"{LANGUAGE_CODE}/pagoda/site_verification.html", context
+ )
+ except PagodaSites.DoesNotExist:
+ return HttpResponseNotFound()
@login_required
@@ -103,12 +109,7 @@ def check_verification_status(request, site_id):
site = PagodaSites.objects.get(siteUniqueIdentifier=site_id, owner=request.user)
if site.verified:
- messages.success(
- request,
- "The site has been verified successfully.",
- extra_tags="pagodaSuccess",
- )
- return HttpResponseRedirect(reverse("pagoda:site", args=[site_id]))
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
if site.verificationMethod == "DNS":
domain = site.url.replace("http://", "").replace("https://", "")
@@ -123,22 +124,10 @@ def check_verification_status(request, site_id):
if txt_string.decode("utf-8") == txt_value:
site.verified = True
site.save()
- messages.success(
- request,
- "The site has been verified successfully.",
- extra_tags="pagodaSuccess",
- )
- return HttpResponseRedirect(
- reverse("pagoda:site", args=[site_id])
- )
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
except dns.resolver.NoAnswer:
pass
- messages.error(
- request,
- "The site could not be verified. Please check the DNS records and try again.",
- extra_tags="pagodaError",
- )
- return HttpResponseRedirect(reverse("pagoda:site", args=[site_id]))
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
elif site.verificationMethod == "Meta":
domain = site.url
response = requests.get(domain)
@@ -151,22 +140,12 @@ def check_verification_status(request, site_id):
):
site.verified = True
site.save()
- messages.success(
- request,
- "The site has been verified successfully.",
- extra_tags="pagodaSuccess",
- )
- return HttpResponseRedirect(reverse("pagoda:site", args=[site_id]))
- messages.error(
- request,
- "The site could not be verified. Please check the Meta tags and try again.",
- extra_tags="pagodaError",
- )
- return HttpResponseRedirect(reverse("pagoda:site", args=[site_id]))
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
else:
pass
- return Http404()
+ return HttpResponseNotFound()
@login_required
@@ -174,11 +153,6 @@ def delete_site(request, site_id):
site = PagodaSites.objects.get(siteUniqueIdentifier=site_id, owner=request.user)
if site:
site.delete()
- messages.success(
- request,
- "The site has been deleted successfully.",
- extra_tags="pagodaSuccess",
- )
return HttpResponseRedirect(reverse("pagoda:home"))
else:
messages.error(
diff --git a/templates/en/pagoda/site_dashboard.html b/templates/en/pagoda/site_dashboard.html
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/templates/en/pagoda/site_dashboard.html
diff --git a/templates/ja/pagoda/home.html b/templates/ja/pagoda/home.html
index 1a0f2414..48e2e0a3 100644
--- a/templates/ja/pagoda/home.html
+++ b/templates/ja/pagoda/home.html
@@ -1,3 +1,167 @@
{% extends 'shared/base.html' %}
{% load static %}
-Welcome to the \ No newline at end of file
+{% block head %}
+<link rel="stylesheet" href="{% static 'css/pagoda/pagoda.css' %}">
+{% endblock head %}
+{% block content %}
+<div class="pagoda-realm">
+{% if not request.COOKIES.visitedPagodaRealm %}
+ <img src="{% static 'images/pagoda/pagoda_banner.png' %}" alt="The Pagoda Realm バナー" class="pagoda-banner">
+ <hr>
+ <div class="pagoda-introduction-text">
+ <h2>The Pagoda Realmへようこそ、{{ user.first_name }}さん!</h2>
+ <p>The Pagoda Realmって何だろう?と思われるかもしれませんね。実は、アカウント登録時にお約束したサービスリストの中の1つでした。でも実は、ちょっとだけウソをついていたんです。The Pagoda Realmは単なる1つのサービスではなく、<em>Neocities</em>や<em>Nekoweb</em>のようなレトロな静的サイトホスティングプロジェクトをサポートするために慎重に設計された<em>サービスの集まり</em>なんです。ウェブはキャンバスで、あなたはアーティスト。想像力が限界です。The Pagoda Realmは、通常では実装が難しいさまざまなツールをあなたのウェブサイトに簡単に統合できる場所なんです。</p>
+ <p>すべてのサービスは、超シンプルで初心者にも優しく設計されています。多くのサービスはJSONデータと事前レンダリングされたiframeを提供しているので、技術的な詳細を気にすることなく、自分のウェブサイトで使用できます。コンポーネントはオシャレにデザインされていて、通常はさまざまなテーマやカスタムCSSをサポートしているので、あなたのウェブサイトのデザインにぴったり合わせられます。</p>
+ <h3>The Pagoda Realmのサービスはどうやって使うの?</h3>
+ <p>The Pagoda Realmのサービスの使い方はとってもシンプル!このページを見ているということは、最初のステップであるアカウント登録は既に完了していますね。アカウント登録が済んだら、次はあなたのウェブサイトをThe Pagoda Realmに接続する必要があります。接続方法は2つあります:</p>
+ <ol>
+ <li><strong>DNS認証を使用する</strong> - これがおすすめの方法です。ウェブサイトのDNS設定にTXTレコードを追加して、サイトの所有権を証明します。DNSレコードを追加したら、ウェブサイトをThe Pagoda Realmに接続できます。</li>
+ <li><strong>メタタグ認証を使用する</strong> - NeocitiesやNekowebのようなホストを使用していてDNS設定にアクセスできない場合の代替方法です。ウェブサイトのHTMLにメタタグを追加して、サイトの所有権を証明します。メタタグを追加したら、ウェブサイトをThe Pagoda Realmに接続できます。</li>
+ </ol>
+ <p>ウェブサイトがThe Pagoda Realmに接続されたら、サービスを使い始めることができます。ジャーナルを作成したり、ウェブログ投稿を書いたり、ウェブログ投稿にコメントを追加したり、ウェブリングに参加したり、ゲストブックにエントリーを追加したり、ウェブサイトに広告を表示したり、訪問者数を確認したりできます。また、JSON APIや事前レンダリングされたiframeを使用して、サービスをウェブサイトに埋め込むこともできます。</p>
+ <h3>The Pagoda Realmではどんなサービスが利用できるの?</h3>
+ <p>The Pagoda Realmで利用できるサービスをご紹介します:</p>
+ <table>
+ <thead>
+ <tr>
+ <th>サービス</th>
+ <th>説明</th>
+ <th>埋め込み形式</th>
+ <th>API</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Journals</td>
+ <td>毎日の出来事、考え、感情を書き留めることができる日記形式のジャーナル。</td>
+ <td>JSON, iframe</td>
+ <td>あり</td>
+ </tr>
+ <tr>
+ <td>Weblogs</td>
+ <td>記事、物語、ブログ投稿を書くことができるシンプルなウェブログサービス。</td>
+ <td>JSON, iframe</td>
+ <td>あり</td>
+ </tr>
+ <tr>
+ <td>Weblog Comments</td>
+ <td>ウェブログ投稿にコメントを追加できるシンプルなコメントシステム。</td>
+ <td>JSON, iframe</td>
+ <td>あり</td>
+ </tr>
+ <tr>
+ <td>Caravan</td>
+ <td>The Pagoda Realmに登録されているすべてのウェブサイトを結びつけるウェブリングサービス。</td>
+ <td>iframe</td>
+ <td>なし</td>
+ </tr>
+ <tr>
+ <td>Ledger</td>
+ <td>ウェブサイト訪問者からフィードバックやコメントを受け取れるゲストブックサービス。</td>
+ <td>JSON, iframe</td>
+ <td>あり</td>
+ </tr>
+ <tr>
+ <td>Pamphlet</td>
+ <td>ウェブサイトにランダムなレトロ風の偽広告を表示する広告シミュレーションサービス。</td>
+ <td>JavaScript</td>
+ <td>なし</td>
+ </tr>
+ <tr>
+ <td>Census</td>
+ <td>ウェブサイトの訪問者数を表示するサービス。</td>
+ <td>iframe</td>
+ <td>あり</td>
+ </tr>
+ </tbody>
+ </table>
+ <ul>
+ <li><strong>Journals</strong> - 毎日の出来事、考え、感情を書き留めることができる日記形式のジャーナルです。ジャーナルはプライベートとパブリックの両方が可能で、目的に応じて複数のジャーナルを作成できます。パブリックジャーナルはウェブサイトに埋め込むことができます。ジャーナルエントリーはカレンダービューで表示でき、JSONフォーマットでエクスポートすることもできます。さらに、JSON APIを使用してウェブサイトでジャーナルエントリーを利用することもできます。</li>
+ <li><strong>Weblogs</strong> - 記事、物語、ブログ投稿を書くことができるシンプルなウェブログサービスです。ウェブログは(下書きモード以外では)デフォルトで常にパブリックで、アカウントごとに1つのウェブログしか持てません。投稿をカテゴリー分けしたり、タグ付けしたり、フルHTMLモードで編集したり、投稿ごとにCSSを変更したりすることができます。JSON APIや事前レンダリングされたiframeを使用して、ウェブログ投稿をウェブサイトに埋め込むこともできます。</li>
+ <li><strong>Weblog Comments</strong> - ウェブログ投稿にコメントを追加できるシンプルなコメントシステムです。コメントシステムをウェブサイトのデザインに合わせてカスタマイズでき、公開前にコメントを管理することもできます。コメントシステムはJSON APIと事前レンダリングされたiframeとしても利用可能です。</li>
+ <li><strong>Caravan</strong> - The Pagoda Realmに登録されているすべてのウェブサイトを結びつけるウェブリングサービスです。The Pagoda Realmにウェブサイトをリンクすると自動的にウェブリングのメンバーになります。ウェブサイトのプレビュー用にカスタムバナー画像をアップロードしたり、バッジをウェブサイトに埋め込んだり、ウェブリング内のウェブサイトリストを表示したりすることもできます。ウェブリングは事前レンダリングされたiframeとしても利用可能です。</li>
+ <li><strong>Ledger</strong> - ウェブサイト訪問者からフィードバックやコメントを受け取れるゲストブックサービスです。ゲストブックをウェブサイトのデザインに合わせてカスタマイズでき、公開前にエントリーを管理することもできます。ゲストブックはJSON APIと事前レンダリングされたiframeとしても利用可能です。</li>
+ <li><strong>Pamphlet</strong> - ウェブサイトにランダムなレトロ風の偽広告を表示する広告シミュレーションサービスです。Pamphletはバナー広告と四角形広告を表示できます。88 x 31ピクセルのボタンも表示できます。ウェブサイトで初期化する必要のあるJavaScriptライブラリとして利用可能です。</li>
+ <li><strong>Census</strong> - ウェブサイトの訪問者数を表示するサービスです。過去24時間、過去7日間、および総訪問者数を表示できます。Censusは事前レンダリングされたiframeとJSON APIとして利用可能です。</li>
+ </ul>
+ <p>これらは、The Pagoda Realmで利用できるサービスの一部にすぎません。今後さらにサービスを追加していく予定なので、アップデートをお楽しみに!質問やフィードバックがありましたら、お気軽にご連絡ください。The Pagoda Realmをお楽しみください!</p>
+ <p>The Pagoda Realmをご利用いただき、ありがとうございます!</p>
+ <button onclick="document.cookie = 'visitedPagodaRealm=true; expires=Fri, 31 Dec 9999 23:59:59 GMT'; window.location.reload();">理解しました!</button>
+ </div>
+{% else %}
+ {% if not pagoda_sites %}
+ <div class="pagoda-dashboard-empty">
+ <h2>The Pagoda Realmへようこそ、{{ user.first_name }}さん!</h2>
+ <p>まだThe Pagoda Realmに接続されているウェブサイトがないようですね。始めるには、ウェブサイトをThe Pagoda Realmに接続する必要があります。接続方法は2つあります:</p>
+ <ol>
+ <li><strong>DNS認証を使用する</strong> - これがおすすめの方法です。ウェブサイトのDNS設定にTXTレコードを追加して、サイトの所有権を証明します。DNSレコードを追加したら、ウェブサイトをThe Pagoda Realmに接続できます。</li>
+ <li><strong>メタタグ認証を使用する</strong> - NeocitiesやNekowebのようなホストを使用していてDNS設定にアクセスできない場合の代替方法です。ウェブサイトのHTMLにメタタグを追加して、サイトの所有権を証明します。メタタグを追加したら、ウェブサイトをThe Pagoda Realmに接続できます。</li>
+ </ol>
+ <h2>The Pagoda Realmにウェブサイトを接続する</h2>
+ <form action="{% url "pagoda:home" %}" method="post">
+ {% csrf_token %}
+ <label for="site_name">サイト名</label>
+ <input type="text" name="site_name" id="site_name" placeholder="マイウェブサイト">
+ <label for="root_url">ルートURL</label>
+ <input type="text" name="root_url" id="root_url" placeholder="https://mysite.neocities.org">
+ <p class="note">注意:ルートURLはウェブサイトのホームページのURLです。カスタムドメインをお持ちの場合は、それを使用することもできます。</p>
+ <label for="verification_method">認証方法</label>
+ <select name="verification_method" id="verification_method">
+ <option value="DNS">DNS認証</option>
+ <option value="Meta">メタタグ認証</option>
+ </select>
+ <button type="submit">ウェブサイトを接続</button>
+ </form>
+ </div>
+ {% else %}
+ <div class="pagoda-dashboard-sites">
+ <h2 style="margin: 8px 0px;">接続済みのウェブサイト</h2>
+ <table>
+ <thead>
+ <tr>
+ <th>サイト名</th>
+ <th>ルートURL</th>
+ <th>認証済み</th>
+ <th>アクション</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for site in pagoda_sites %}
+ <tr>
+ <td><a href="{% url "pagoda:site" site.siteUniqueIdentifier %}">{{ site.name }}</a></td>
+ <td style="text-align: center;"><a href="{{ site.url }}" target="_blank">{{ site.url }}</a></td>
+ <td style="text-align: center;">{% if site.verified %}✅{% else %}❌{% endif %}</td>
+ <td style="text-align: center;">
+ <a href="{% url "pagoda:site" site.siteUniqueIdentifier %}">サイトを管理</a>
+ </td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ <div class="pagoda-dashboard-empty">
+ <h2>The Pagoda Realmに別のウェブサイトを接続する</h2>
+ <form action="{% url "pagoda:home" %}" method="post">
+ {% csrf_token %}
+ <label for="site_name">サイト名</label>
+ <input type="text" name="site_name" id="site_name" placeholder="マイウェブサイト">
+ <label for="root_url">ルートURL</label>
+ <input type="text" name="root_url" id="root_url" placeholder="https://mysite.neocities.org">
+ <p class="note">注意:ルートURLはウェブサイトのホームページのURLです。カスタムドメインをお持ちの場合は、それを使用することもできます。</p>
+ <label for="verification_method">認証方法</label>
+ <select name="verification_method" id="verification_method">
+ <option value="DNS">DNS認証</option>
+ <option value="Meta">メタタグ認証</option>
+ </select>
+ <button type="submit">ウェブサイトを接続</button>
+ </form>
+ {% for message in messages %}
+ {% if 'pagodaError' in message.tags %}
+ <p style="color: #ff9a9a;">{{ message }}</p>
+ {% endif %}
+ {% endfor %}
+ </div>
+ </div>
+ {% endif %}
+{% endif %}
+</div>
+{% endblock content %} \ No newline at end of file
diff --git a/templates/ja/pagoda/site_verification.html b/templates/ja/pagoda/site_verification.html
new file mode 100644
index 00000000..a92c167e
--- /dev/null
+++ b/templates/ja/pagoda/site_verification.html
@@ -0,0 +1,165 @@
+{% extends 'shared/base.html' %}
+{% load static %}
+{% block head %}
+<style>
+.verification-container {
+ background-color: rgba(134, 99, 229, 0.1);
+ border: 1px solid #8d8dff;
+ border-radius: 8px;
+ padding: 24px;
+ margin: 16px 0;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .verification-container::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background: linear-gradient(90deg, transparent, #df23c4, transparent);
+ animation: scanline 2s linear infinite;
+ }
+
+ /* Page Title */
+ .verification-container h1 {
+ color: #fff;
+ margin-bottom: 12px;
+ text-shadow: 0 0 10px #8663e5;
+ }
+
+ /* Section Headers */
+ .verification-container h2 {
+ color: #8d8dff;
+ margin: 12px 0 12px 0;
+ padding-bottom: 8px;
+ border-bottom: 1px solid rgba(141, 141, 255, 0.3);
+ }
+
+ /* Status Indicators */
+ .verification-status {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 4px;
+ font-weight: 500;
+ margin: 8px 4px;
+ }
+
+ .status-verified {
+ background-color: rgba(0, 255, 0, 0.2);
+ border: 1px solid #00ff00;
+ }
+
+ .status-not-verified {
+ background-color: rgba(255, 0, 0, 0.2);
+ border: 1px solid #ff0000;
+ }
+
+ /* Code Display */
+ .verification-container code {
+ background-color: rgba(0, 0, 0, 0.3);
+ padding: 0px 12px;
+ border-radius: 4px;
+ border: 1px solid #8663e5;
+ display: inline-block;
+ margin: 8px 0;
+ font-family: monospace;
+ font-size: 12px;
+ }
+
+ /* Record Display */
+ .record-details {
+ background-color: rgba(98, 55, 149, 0.2);
+ padding: 16px;
+ border-radius: 4px;
+ margin: 16px 0;
+ }
+
+ .record-details p {
+ margin: 8px 0;
+ }
+
+ /* Buttons */
+ .verification-container button {
+ background: linear-gradient(45deg, #8663e5, #df23c4);
+ border: none;
+ padding: 12px 24px;
+ border-radius: 4px;
+ color: #fff;
+ font-weight: 500;
+ cursor: pointer;
+ margin: 8px 8px 8px 0;
+ transition: all 0.3s ease;
+ }
+
+ .verification-container button:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 0 15px rgba(223, 35, 196, 0.5);
+ }
+
+ .delete-button {
+ background: linear-gradient(45deg, #ff3366, #ff0000) !important;
+ }
+
+ /* Strong Tags */
+ .verification-container strong {
+ color: #da73ff;
+ font-weight: 600;
+ }
+
+ /* Animation */
+ @keyframes scanline {
+ 0% {
+ transform: translateX(-100%);
+ }
+ 100% {
+ transform: translateX(100%);
+ }
+ }
+
+ /* Responsive Adjustments */
+ @media (max-width: 1200px) {
+ .verification-container {
+ margin: 16px;
+ }
+ }
+</style>
+{% endblock head %}
+{% block content %}
+<div class="verification-container">
+ <h1>{{ site.name }}の認証詳細</h1>
+ <p>The Pagoda Realmでサイトを認証するために必要な情報は以下の通りです:</p>
+ <p><strong>認証方法:</strong> {% if site.verificationMethod == 'DNS' %}DNS認証{% else %}メタタグ認証{% endif %}</p>
+ <div class="record-details">
+ {% if site.verificationMethod == 'DNS' %}
+ <p><strong>TXTレコード名:</strong> {{ site.verficationRecordName }}</p>
+ <p><strong>TXTレコード値:</strong> {{ site.verificationRecordValue }}</p>
+ {% else %}
+ <p><strong>メタタグ:</strong><code>&lt;meta name="{{ site.verficationRecordName }}" content="{{ site.verificationRecordValue }}"&gt;</code></p>
+ {% endif %}
+ </div>
+ <p>
+ <strong>認証状態:</strong>
+ <span class="verification-status {% if site.verified %}status-verified{% else %}status-not-verified{% endif %}">
+ {% if site.verified %}認証済み{% else %}未認証{% endif %}
+ </span>
+ </p>
+
+ <h2>認証手順</h2>
+ <p>サイトを認証するには、以下の情報をサイトのコードに追加する必要があります:</p>
+ {% if site.verificationMethod == 'DNS' %}
+ <p>ドメインレジストラのコントロールパネルにログインし、以下の詳細で新しいTXTレコードを追加してください:</p>
+ <p><strong>レコード名:</strong> {{ site.verficationRecordName }}</p>
+ <p><strong>レコード値:</strong> {{ site.verificationRecordValue }}</p>
+ {% else %}
+ <p>サイトのHTMLコードを開き、<code>&lt;head&gt;</code>セクションに以下のメタタグを追加してください:</p>
+ <p><code>&lt;meta name="{{ site.verficationRecordName }}" content="{{ site.verificationRecordValue }}"&gt;</code></p>
+ {% endif %}
+ <p>情報を追加したら、下のボタンをクリックして認証状態を確認してください。</p>
+
+ <button class="verify-button" onclick="window.location.href = '{% url 'pagoda:site_status' site.siteUniqueIdentifier %}'">認証状態を確認</button>
+ <button class="delete-button" onclick="window.location.href = '{% url 'pagoda:delete_site' site.siteUniqueIdentifier %}'">サイトを削除</button>
+</div>
+{% endblock %} \ No newline at end of file
diff --git a/thatcomputerscientist/settings.py b/thatcomputerscientist/settings.py
index b1062055..43b069ec 100644
--- a/thatcomputerscientist/settings.py
+++ b/thatcomputerscientist/settings.py
@@ -218,7 +218,7 @@ AUTH_PASSWORD_VALIDATORS = [
# for key in cache.keys("presence_*"):
# cache.delete(key)
-SESSION_ENGINE = "django.contrib.sessions.backends.cache"
+SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/